当我需要从DATETIME
对象截断时间时,我通常使用
DATEADD(day, 0, DATEDIFF(day, 0, <myDateField>))
并且工作正常。最近我需要从DATETIME
字段获取本月的第一天,所以我使用了
DATEADD(month, 0, DATEDIFF(month, 0, <myDateField>))
我的查询得到了奇怪的结果,所以我实际上已经尝试了这个并且看到了 - 错误的答案!我在1903年得到了约会。通过文档,我看到它“应该”实际上是
DATEADD(month, DATEDIFF(month, 0, <myDateField>), 0)
确实有效。
那么 - 为什么DATEADD
在使用天数时将(非零)整数解释为日期,但在使用月份时却没有问题?
答案 0 :(得分:0)
这是因为...... DATEDIFF(day, 0, <myDateField>)
基本上是日期时间的整数表示,可以转换为日期时间。然后你的dateadd会增加0天,所以没有意义。
这就是为什么它不会在一个月内工作... DATEDIFF(month, 0, <myDateField>)
与cast(<myDateField> as int)
或DATEDIFF(day, 0, <myDateField>)
考虑这些......
select
getdate(),
datediff(dd, 0, getdate()),
cast(getdate() as int)
IMO,最好不要依赖于此。我总是使用dateadd(dd, datediff(dd, 0, @d), 0)
形式来消除时间。或dateadd(m, datediff(m, 0, @d), 0)
移至月初。
答案 1 :(得分:0)
刚刚意识到发生了什么。如果DATEADD
必须将其第三个参数从int
转换为datetime
,那么它假定以天为单位表示,与任何datepart类型作为其第一个参数无关。因此它将1373(在我的情况下)转换为日期,最终得到10/6/1903加上零月,这就是结果。