2015-04-16 49 views
0

我在SSMS中查詢後正在運行。這個查詢的結果沒有任何意義。日期差異在SQL Server 2012中如何工作

問題:SQL Server在確定與此查詢有關的差異時確實遵循了什麼邏輯?

SELECT 
    CAST('1/1/1900 11:00:00 PM' AS DATETIME) AS Date1, 
    CAST('1/1/1900 7:00:00 AM' AS DATETIME) AS Date2, 
    CAST('1/1/1900 7:00:00 AM' AS DATETIME) - CAST('1/1/1900 11:00:00 PM' AS DATETIME) 
    AS Date2MinusDate1 

結果此查詢

Date Difference in SQL Server 2012

回答

2

的事情是,在內部的日期時間數據被存儲爲8字節由2點的整數:一個19000101和其他代表午夜後蜱後表示天。所以實際上你在這裏從其減去2點的整數:

Day of DT1 - Day of DT2 
Ticks of DT1 - Ticks of DT2 

天都爲0,因爲19000101在內部保存爲0。所以第一次減法給你0,即19000101

蜱的差異會給你16小時,但要注意力放在,這將是自午夜蜱(16小時),所以實際上你應該從。減去午夜不小時。因此00:00 - 16 hours等於08:00。當然,這裏你會減少一天的破壞結果,即0-1=18991231

所以你最終得到18991231 08:00這是正確的輸出。

但是在使用操作符進行日期操作時,您應該非常小心,因爲存在細微差別。使用本機功能進行此類操作,例如DATEADD。你可以閱讀這篇文章,特別是從第2頁http://www.devx.com/dbzone/Article/34594/0/page/2

+0

所以看來,日期時間減法的作品。 – Sunil

+1

不,它不是。請閱讀第2頁http://www.devx.com/dbzone/Article/34594/0/page/2 –

+0

我認爲你應該寫下這個事實作爲你的答案的一部分,即減法對日期時間值不可靠。 – Sunil

1

的1899年12月31日的是SQLS相當於零日期。

這是一個不好的日期兼容軟件的保留。

看到這個答案:Why is 1899-12-30 the zero date in Access/SQL Server instead of 12/31?

我會建議DATEDIFF尋找差異。

SELECT 
    CAST('1/1/1900 11:00:00 PM' AS DATETIME) AS Date1, 
    CAST('1/1/1900 7:00:00 AM' AS DATETIME) AS Date2, 
    DATEDIFF (hh , CAST('1/1/1900 7:00:00 AM' AS DATETIME) , CAST('1/1/1900 11:00:00 PM' AS DATETIME)) AS Date2MinusDate1 
+0

但它看起來像日期時間扣除是可靠的,因爲如果我們添加Date1 + Date2MinusDate1,那麼我們得到Date2。因此,似乎SQL Server 2012中的日期時間算法具有一致性。 – Sunil

+1

它可能與日期格式有關。如果您運行:SELECT CAST('1900-01-01 23:00:00.000'AS DATETIME)AS Date1, CAST('1900-01-01 07:00:00.000'AS DATETIME)AS Date2, CAST '1900-01-01 23:00:00.000'AS DATETIME) - CAST('1900-01-01 07:00:00.000'AS DATETIME) AS Date2MinusDate1您將獲得4:00 PM,這將準確地轉化爲16小時差。 – Cyberdrew