2014-05-14 257 views
0

我想減去2日期時間值並返回SQL中的日期時間。目前,我只是這樣做:減去2日期時間並獲得日期時間返回

DECLARE @difference DATETIME = @endtime - @starttime 

然而,這樣做是:當

@endTime = '2014-2-22 00:12:00' and @startTime = '2014-2-22 00:00:00' 

我預計@difference是0000-00-00 0點12分00秒 但取而代之的則是: 1900-01-01 00:12:00

我怎樣才能得到這個固定的?我試圖使用DATEDIFF,但返回一個特定的整數,可以是年,月等,但不是DATETIME。

+0

0000-00-00 0點12分00秒是無效日期時間在Sql Server中。你試圖找到什麼樣的差異。你可以根據需要找到幾小時或幾分鐘的差異並將其轉換爲天數? – NoviceProgrammer

回答

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
  • 通過從@end.time-of-day減去@start.time-of-day來計算新的時間價值。
  • 通過從@減去@start.date end.date`

計算新日期如果所得到的值是datetime外域(1753-01-01T00:00:00.000通過9999-12-31T23:59:59.997)引發錯誤。

您將得到預期的結果... 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 
+0

很清楚,謝謝! –