减去2个日期时间并返回日期时间

时间:2014-05-14 18:43:21

标签: sql datetime

我试图减去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。

1 个答案:

答案 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来计算新的时间价值。
  • 通过从@ end.date`
  • 中减去@start.date来计算新日期

如果结果值超出datetime1753-01-01T00:00:00.0009999-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