【问题标题】:SQL date issue when date is not isdate日期不是 isdate 时的 SQL 日期问题
【发布时间】:2013-09-11 16:27:11
【问题描述】:
Expiry                             DateEnd

None                        2000-06-29 00:00:00.000

None                        2000-06-29 00:00:00.000

september 2013              2013-06-29 00:00:00.000

January 2012                2013-06-29 00:00:00.000

May 2020                    2013-06-29 00:00:00.000

2013-06-29 00:00:00.000     2013-06-29 00:00:00.000

由于未来日期,我想从两列中选择除 2020 年 5 月行之外的所有日期。 这就是我目前所拥有的

DECLARE @YearFlag datetime

SET @YearFlag = DATEADD(yy,-5,GETDATE())

SELECT * 
FROM #Table
WHERE (DateEnd IS NULL OR DateEnd = '' OR DateEnd <= @YearFlag)
   OR (CHARINDEX(Convert(varchar, YEAR(GETDATE())),Expiry) > 0)

正在使用下面的一个来选择 2012 年 1 月的行但出现错误

OR (Expiry != 'none' AND Expiry  <= GETDATE())

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    我假设你想从你的选择中排除未来的日期,所以你可以使用这样的东西。

    (另外,请指定 RDBMS,因为 GETDATE() 函数在您使用的那个中可能不可用)

    SELECT Expiry,
        DateEnd
    FROM YOUR_TABLE
    WHERE Expiry <> 'none'
          AND convert(INT, substring(expiry, charindex(' ', expiry, 0), len(expiry))) < YEAR(GETDATE())
          AND CASE LOWER(substring(expiry, 0, charindex(' ', expiry, 0)))
              WHEN 'january' THEN 1
              WHEN 'february' THEN 2
              WHEN 'march' THEN 3
              WHEN 'april' THEN 4
              WHEN 'may' THEN 5
              WHEN 'june' THEN 6
              WHEN 'july' THEN 7
              WHEN 'august' THEN 8
              WHEN 'september' THEN 9
              WHEN 'october' THEN 10
              WHEN 'november' THEN 11
              ELSE 12
              END < MONTH(GETDATE())
    

    这里是 SQLFiddle 代码的工作原理。

    【讨论】:

    • 第一个过滤器杀死它
    • @MeteAgar 好的,我现在明白你的意思了。
    • @MeteAgar 你可以用这个(虽然不完整,我必须添加月份条件)。目前只是比较年份。
    • @MeteAgar 你完成了。这是代码。您可能想添加您想要的其他条件,我没有添加所有条件,我只是解决了您遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多