我要做的是查看日期时间变量是否在过去十二个月的任何时间具有日期值。
我尝试使用 DATEDIFF 函数,但很快我发现这存在舍入问题(例如,12 月 31 日/1 月 1 日之间的比较将计为 1 个月,尽管事实上它们之间只过去了一天)
为了使这一点更准确,我可以使用 -365 天而不是 -12 个月作为参数,但这仍然会产生不考虑闰年的问题(这不是一种常见的情况,但我仍然希望避免这种情况!)
关于如何最好地解决这个问题的任何想法?
我要做的是查看日期时间变量是否在过去十二个月的任何时间具有日期值。
我尝试使用 DATEDIFF 函数,但很快我发现这存在舍入问题(例如,12 月 31 日/1 月 1 日之间的比较将计为 1 个月,尽管事实上它们之间只过去了一天)
为了使这一点更准确,我可以使用 -365 天而不是 -12 个月作为参数,但这仍然会产生不考虑闰年的问题(这不是一种常见的情况,但我仍然希望避免这种情况!)
关于如何最好地解决这个问题的任何想法?
改用DATEADD从今天减去一年并进行比较
@datetimevariable >= DATEADD(year, -1, GETDATE())
注意:除非您有未来的日期,否则您不需要比较上限 (GETDATE())。
另外,您是否想要精确到小时和分钟的一年?如果不是,请使用 this ,这对于数据类型优先级是安全的if @datetimevariable
is datetime
or datetime2
,并且您需要 this is a 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 适用于特定边界:月初、年初、午夜等,这就是在这种情况下失败的原因
闰年的问题可以通过 DATEADD (datepart , number , date ) 函数来解决。您可以指定从当前日期起减去一年。
where myDate between DATEADD (year , -1 , GETDATE() ) and GETDATE()
DATEDIFF 计算两个日期之间的分区数,很抱歉没有舍入问题,它完全按照它在锡上所说的那样做。您最好的解决方案可能是使用 DATEADD
WHERE MyVal BETWEEN GETDATE() AND DATEADD(YEAR, -1, GETDATE())