Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DATEADD与月份和日期的差异_Sql_Tsql_Dateadd - Fatal编程技术网

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,…)
与date
0
,1900-1-1不同,因此它可以转换为原始日期我知道,但当它是dateadd函数的第三个参数时,它会自动转换为datetime。我读过你的。我的代码没有失败,因为“DATEDIFF…是datetime的整数表示形式”。之所以失败,是因为DATEADD总是假定它的最后一个参数是以天为单位的
datetime
。@Conrad,但正因为如此,它才失败!!!它之所以有效,是因为日差是整数表示,而月差不是整数表示!
select 
    getdate(),
    datediff(dd, 0, getdate()), 
    cast(getdate() as int)