我试图减去2个日期时间值并在SQL中获取日期时间。我目前只是这样做:
DECLARE @difference DATETIME = @endtime - @starttime
但是,它的作用是:何时
@endTime = '2014-2-22 00:12:00' and @startTime = '2014-2-22 00:00:00'
我希望@difference成为00:12:00 但它是:1900-01-01 00:12:00
我怎样才能解决这个问题?我尝试使用DATEDIFF但是返回一个特定的整数,可以是年,月等,但不是DATETIME。
答案 0 :(得分:1)
SQL Server datetime
日历的纪元(零点)为1900-01-01T00:00:00.000
。如果您执行类似
select convert(datetime,'')
这就是你将获得的价值。
SQL Server的datetime
数据类型由2个带符号的32位整数组成。第一个是从纪元开始的天数偏移;第二个是时间表示为从开始日起的毫秒数偏移量。
当您减去两个日期时间值时,请说出@end
和@start
,这样做可以满足您的期望。
@end.time-of-day
是< @start.time-of-day
,从@end.date
开始一天的毫秒,并递减@end.date
。@start.time-of-day
中减去@end.time-of-day
来计算新的时间价值。@start.date
来计算新日期
如果结果值超出datetime
(1753-01-01T00:00:00.000
到9999-12-31T23:59:59.997
)的范围,则会引发错误。
您正在获得预期的结果... for SQL Server 。
编辑以显示正在进行的内容:
declare @x datetime = '2014-02-22 00:12:00'
declare @y datetime = '2014-02-22 00:00:00'
declare @z datetime = @x - @y
select 'end' ,
date = @x ,
description = 'days_since_epoch' ,
value = convert(int,substring( convert(varbinary(8),@x) , 1 , 4 ) ) ,
description = 'time_as_ms_offset' ,
value = convert(int,substring( convert(varbinary(8),@x) , 5 , 4 ) )
union select 'start' ,
date = @y ,
description = 'days_since_epoch' ,
value = convert(int,substring( convert(varbinary(8),@y) , 1 , 4 ) ) ,
description = 'time_as_ms_offset' ,
value = convert(int,substring( convert(varbinary(8),@y) , 5 , 4 ) )
union select 'delta' ,
date = @z ,
description = 'days_since_epoch' ,
value = convert(int,substring( convert(varbinary(8),@z) , 1 , 4 ) ) ,
description = 'time_as_ms_offset' ,
value = convert(int,substring( convert(varbinary(8),@z) , 5 , 4 ) )
产生这个结果,显示数学:
date description value description value
----- ----------------------- ---------------- ----- ----------------- ------
end 2014-02-22 00:12:00.000 days_since_epoch 41690 time_as_ms_offset 216000
start 2014-02-22 00:00:00.000 days_since_epoch 41690 time_as_ms_offset 0
delta 1900-01-01 00:12:00.000 days_since_epoch 0 time_as_ms_offset 216000