Sql server SQL过滤掉任何年份的特定月份、日期和时间
Sql server SQL过滤掉任何年份的特定月份、日期和时间,sql-server,date,datetime,dynamics-nav,Sql Server,Date,Datetime,Dynamics Nav,Microsoft Dynamics NAV使用yyyy-12-31 23:59:59.000的datetime来识别年度结账分录。我正在尝试写一份报告,除了这些之外,它将包含我所有的条目。如果我显式使用WHERE子句 WHERE [Posting Date] <> '2014-12-31 23:59:59.000') 其中[发布日期]‘2014-12-31 23:59:59.000’) 但我需要这个查询在任何一年都有效。我试过: WHERE (DATEPART(mm, [Pos
Microsoft Dynamics NAV
使用yyyy-12-31 23:59:59.000的datetime
来识别年度结账分录。我正在尝试写一份报告,除了这些之外,它将包含我所有的条目。如果我显式使用WHERE
子句
WHERE [Posting Date] <> '2014-12-31 23:59:59.000')
其中[发布日期]‘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)
其中(日期部分(mm,[过账日期])12)和
(日期部分(dd,[过账日期])31)和
(日期部分(hh,[发布日期])23)和
(日期部分(mi,[发布日期])59)和
(日期部分(ss,[发布日期])59)
但这过滤掉了12月的一切,或是31天的一切,或是23小时的一切,等等
是否有一种简单的方法可以过滤给定的日期时间,但不包括任何年份?可能是这样的:
WHERE MONTH([Posting Date]) <> 12 OR
DAY([Posting Date]) <> 31 OR
CAST([Posting Date] AS TIME) <> CAST('23:59:59.000' AS TIME)
其中月份([过账日期])12或
第31天([过账日期])或
演员阵容([发布日期]为时间)演员阵容('23:59:59.000'为时间)
更简短的回答是:
WHERE YEAR([Posting Date]) <> YEAR(DATEADD(ss, 1, [Posting Date]))
其中年份([过账日期])年份(日期添加(ss,1,[过账日期])
您还可以做的另一件事是这样的,这与您尝试过的方法略有不同
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
在这种情况下,我只使用一个案例
来识别那些日期为一年中最后一秒的行,其余的行由1/0计算并过滤掉不需要的记录。不幸的是,我得到的结果与我的查询不起作用的结果相同。@Boone,是的,有一个错误,您需要或
sI怀疑这样做的性能会非常差,因为查询优化器将无法使用任何索引,并且必须处理每一行。更好的办法是创建一个包含未来50年排除日期(仅50行)的表,并将其从报告中排除,例如使用“WHERE[Posting Date]NOT IN…”@PanagiotisKanavos,谢谢您的建议。虽然我的数据相对较小,但实现起来非常简单,执行时间从11秒减少到8秒。