本文目錄列表:
SQL Server 中針對datetime和smalldatetime這兩個日期時間數據類型提供一個基准日期,也就是1900-01-01。
以下摘錄自MSDN:
SQL Server 2005 數據庫引擎用兩個 4 字節的整數內部存儲 datetime 數據類型的值。第一個 4 字節存儲“基礎日期”(即 1900 年 1 月 1 日)之前或之后的天數。基礎日期是系統參照日期。另外一個 4 字節存儲天的時間,以午夜后經過的 1/300 秒數表示。
smalldatetime 數據類型存儲天的日期和時間,但精確度低於 datetime。數據庫引擎將 smalldatetime 值存儲為兩個 2 字節的整數。第一個 2 字節存儲 1900 年 1 月 1 日后的天數。另外一個 2 字節存儲午夜后經過的分鍾數。
注意:
1、以上“基礎日期”(即1900年1月1日)也就是本文要說的基准日期。
smalldatetime的日期范圍
根據msdn中相關資料是[1900-01-01,2079-06-06]。
SQL Server針對datetime和smalldatetime的數據類型的變量或字段列賦值為0或1900-01-01,其結果是相同的。
以下T-SQL代碼效果如下:


smalldatetime日期的最大值為2079-06-06,如果針對該數據的賦值為65535
(該值為
無符號2字節整數的最大值2^16-1),結果也是為2079-06-06的,以下T-SQL代碼效果如下:


從0對應1900-01-01,65535對應2079-06-06其對應關系,大致可以得到smalldatetime的日期范圍和無符號2字節整數的范圍正好一一對應的。可以通過T-SQL得到證明,如下:




注意:
1、中間省略了部分,僅顯示頭和尾的數據對應,中間省略。
2、函數dbo.ufn_GetNums可以參看SQL Server數字輔助表的實現。
smalldatetime的日期范圍是和無符號2字節整數的范圍一一對應的。針對這種對應關系,如果數據表中的字段列為日期時間數據類型,且精度為天,就可以保存一個整數和該日期保存一種對應關系,可以參考基准日期1900-01-01做起點映射,當然也可以選擇其他的日期,當然也考慮相應的日期時間數據類型的范圍的。