SQL筛选出任何年份的特定月,日和时间

时间:2015-05-29 13:27:24

标签: sql-server date datetime dynamics-nav

Microsoft Dynamics NAV使用datetime yyyy-12-31 23:59:59.000来识别年度结算条目。我正在尝试编写一份报告,除了这些报告之外,还会带来我的所有参赛作品。如果我明确使用

2014子句,则查询适用于WHERE
WHERE [Posting Date] <> '2014-12-31 23:59:59.000')

但我需要查询才能适用于任何一年。我试过了:

WHERE (DATEPART(mm, [Posting Date]) <> 12) AND 
      (DATEPART(dd, [Posting Date]) <> 31) AND 
      (DATEPART(hh, [Posting Date]) <> 23) AND 
      (DATEPART(mi, [Posting Date]) <> 59) AND 
      (DATEPART(ss, [Posting Date]) <> 59)

但这会过滤掉December中的所有内容或31或一小时23等的所有内容......

是否有一种简单的方法可以过滤给定的日期时间,但任何年份?

2 个答案:

答案 0 :(得分:1)

可能是这样的:

WHERE MONTH([Posting Date]) <> 12 OR
      DAY([Posting Date]) <> 31 OR
      CAST([Posting Date] AS TIME) <> CAST('23:59:59.000' AS TIME)

更简短的回答:

WHERE YEAR([Posting Date]) <> YEAR(DATEADD(ss, 1, [Posting Date]))

答案 1 :(得分:0)

您还可以做的另一件事就是这样,这与您尝试的内容略有不同。

WHERE 1 = CASE 
        WHEN (
                DATEPART(MONTH, [POSTING DATE]) = 12
                AND DATEPART(DAY, [POSTING DATE]) = 31
                AND DATEPART(HOUR, [POSTING DATE]) = 23
                AND DATEPART(MINUTE, [POSTING DATE]) = 59
                AND DATEPART(SECOND, [POSTING DATE]) = 59
                )
            THEN 0
        ELSE 1
        END

在这种情况下,我只使用CASE来识别那些日期是一年中最后一秒的行,而评估1/0则完成其余的行并过滤掉不需要的记录。