如何检查过去12个月内是否发生日期时间变量

时间:2013-04-23 08:40:30

标签: sql sql-server sql-server-2008

我要做的是查看datetime变量是否具有过去12个月中任何时间的日期值。

我尝试使用DATEDIFF功能但后来我很快发现这有舍入问题(例如,在第31届DEC / 1月1日之间的比较将计为1个月,尽管事实上它们之间只有一天过去了)

为了使这个更准确,我可以使用-365天作为参数而不是-12个月然而这仍然给出了不考虑闰年的问题(不是常见的情况,但仍然是我理想的避免!)

关于我如何最好地解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

使用DATEADD代替从今天减去一年并比较

@datetimevariable >= DATEADD(year, -1, GETDATE())

注意:除非你将来有日期,否则你不需要比较上限(GETDATE())。

另外,你想要一年到一小时一分钟吗?如果没有,如果@datetimevariabledatetimedatetime2,请使用datatype precedence安全的,并且您需要这是一个WHERE子句或

@datetimevariable >= CAST(DATEADD(year, -1, GETDATE()) as date)

这适用于闰年

SELECT DATEADD(YEAR, -1, '20120301'), DATEADD(YEAR, -1, '20120229')

2011-03-01 00:00:00.000
2011-02-28 00:00:00.000

DATEDIFF适用于特定的边界:月初,年初,午夜等,这就是为什么它在这种情况下失败

答案 1 :(得分:1)

使用DATEADD(datepart,number,date)函数可以解决闰年的问题。您可以指定从当前日期起减去一年。

where myDate between DATEADD (year , -1 , GETDATE() ) and GETDATE()

答案 2 :(得分:0)

DATEDIFF计算两个日期之间的分区数量,不好意思说没有舍入问题,它完全按照它在锡上的说法完成。您最好的解决方案可能是使用DATEADD

WHERE MyVal BETWEEN GETDATE() AND DATEADD(YEAR, -1, GETDATE())