[Datetime + 420./1440](7小时)的结果是错误的(以ms为单位的精度丢失)

时间:2010-10-25 12:08:23

标签: sql-server-2005 datetime

可以解释为什么在这样做之后我无法获得有效的结果(精确到毫秒)(到目前为止增加7小时):

select getdate() as dt into #t1
select dt, dt+(7.*60/1440) as dt_new from #t1

我得到了:

dt                      dt_new
2010-10-25 04:56:33.640 2010-10-25 11:56:33.580

正如你所看到的,dt_new有60ms的差异 - 为什么? AFAIR我能在Oracle 10g中做到这一点 - 即使是几分钟: date + 5/1440 - 生成5分钟的日期时间。

UPD:

我的错误 - 正确的做法是:

select getdate(), getdate()+(convert(float, 5)/1440) as dt_new 

我认为Ms Sql server选择了错误的隐式转换。

UPD2: 感谢您的回复,但我的观点是“arifmetic”方法 - 因为有些情况下计算日期 没有 dateadd确实改进了查询计划 - 通过消除表扫描是Dateadd和其他功能的情况。 无论如何它都有效 - 谢谢!

3 个答案:

答案 0 :(得分:4)

您还可以使用内置函数,例如

select dt, DATEADD(hour, 7, dt) as dt_new from #t1

我对使用+的不精确性的猜测是它从datetime转换为整数,然后再转回。

答案 1 :(得分:3)

实际上,向datetime添加7小时的更正确的方法是使用DATEADD

select getdate() as dt into #t1
select dt, dateadd(hh, 7, dt) as dt_new from #t1

给出

dt                      dt_new
----------------------- -----------------------
2010-10-25 13:16:35.067 2010-10-25 20:16:35.067

答案 2 :(得分:1)

使用dateadd()函数可以获得更好的结果(就像前面提到的海报一样)。如果你想使用算术,使用更好的数据类型,比如float-cast(7 as float)而不是7.运行良好。