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