日期不是isdate时的SQL日期问题

时间:2013-09-11 07:56:00

标签: sql sql-server

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())

1 个答案:

答案 0 :(得分:0)

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

(另外,请指定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