Sql DATEADD与月份和日期的差异
当我需要从Sql DATEADD与月份和日期的差异,sql,tsql,dateadd,Sql,Tsql,Dateadd,当我需要从DATETIME对象截断时间时,我通常使用 DATEADD(day, 0, DATEDIFF(day, 0, <myDateField>)) 我从我的查询中得到了奇怪的结果,所以我实际上自己尝试了这个,瞧,答案错了!我在1903年有个约会。翻阅文档,我发现它“应该”是 DATEADD(month, DATEDIFF(month, 0, <myDateField>), 0) DATEADD(月,日期差(月,0,),0) 这确实有效 那么-为什么DATEADD
DATETIME
对象截断时间时,我通常使用
DATEADD(day, 0, DATEDIFF(day, 0, <myDateField>))
我从我的查询中得到了奇怪的结果,所以我实际上自己尝试了这个,瞧,答案错了!我在1903年有个约会。翻阅文档,我发现它“应该”是
DATEADD(month, DATEDIFF(month, 0, <myDateField>), 0)
DATEADD(月,日期差(月,0,),0)
这确实有效
那么-为什么
DATEADD
在使用天时将(非零)整数解释为日期不会有问题,但在使用月时会有问题?这是因为…DATEDIFF(day,0,)
基本上是日期时间的整数表示形式,可以转换为日期时间。然后,dateadd会增加0天,因此它是没有意义的
这就是为什么它不适用于月份…DATEDIFF(month,0,)
的值与cast(as int)
或DATEDIFF(day,0,)
想想这些
select
getdate(),
datediff(dd, 0, getdate()),
cast(getdate() as int)
依我看,最好不要依赖这个。我总是使用
dateadd(dd,datediff(dd,0,@d),0)
来删除时间。或者dateadd(m,datediff(m,0,@d),0)
移动到月初。刚刚意识到发生了什么。如果DATEADD
必须将其第三个参数从int
转换为datetime
,则它假定该参数以天为单位表示,与用作其第一个参数的日期部分类型无关。因此,它将1373(在我的例子中)转换为一个日期,并以1903年6月10日加上零个月结束,这就是结果。事实并非如此-您所有的语句都有错误,在处理日期时会自动取消。日期0
为1900-1-1,因此DATEDIFF(day,0,…)
返回自日期0
以来的天数。然后将其添加回最新的0
。有更好的截断方法,例如CAST(myDateField作为日期)
DATEDIFF不是日期,而是实际的差异。恰好,DATEDIFF(dd,0,…)
与date0
,1900-1-1不同,因此它可以转换为原始日期我知道,但当它是dateadd函数的第三个参数时,它会自动转换为datetime。我读过你的。我的代码没有失败,因为“DATEDIFF…是datetime的整数表示形式”。之所以失败,是因为DATEADD总是假定它的最后一个参数是以天为单位的datetime
。@Conrad,但正因为如此,它才失败!!!它之所以有效,是因为日差是整数表示,而月差不是整数表示!
select
getdate(),
datediff(dd, 0, getdate()),
cast(getdate() as int)