可以解释为什么在这样做之后我无法获得有效的结果(精确到毫秒)(到目前为止增加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和其他功能的情况。
无论如何它都有效 - 谢谢!
答案 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.运行良好。