我要做的是查看datetime变量是否具有过去12个月中任何时间的日期值。
我尝试使用DATEDIFF功能但后来我很快发现这有舍入问题(例如,在第31届DEC / 1月1日之间的比较将计为1个月,尽管事实上它们之间只有一天过去了)
为了使这个更准确,我可以使用-365天作为参数而不是-12个月然而这仍然给出了不考虑闰年的问题(不是常见的情况,但仍然是我理想的避免!)
关于我如何最好地解决这个问题的任何想法?
答案 0 :(得分:1)
使用DATEADD代替从今天减去一年并比较
@datetimevariable >= DATEADD(year, -1, GETDATE())
注意:除非你将来有日期,否则你不需要比较上限(GETDATE())。
另外,你想要一年到一小时一分钟吗?如果没有,如果@datetimevariable
为datetime
或datetime2
,请使用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())