DATEADD与月和日的差异

时间:2014-06-10 13:53:57

标签: sql tsql dateadd

当我需要从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在使用天数时将(非零)整数解释为日期,但在使用月份时却没有问题?

2 个答案:

答案 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加上零月,这就是结果。