哪個: sql
是在SQL Server 2008+中存儲日期和時間的推薦方法嗎? spa
我知道精度(和存儲空間可能)的差別,但暫時忽略這些,是否有關於什麼時候使用什麼的最佳實踐文檔,或者咱們應該只使用datetime2
? .net
datetime2在大多數方面獲勝,除了(舊應用程序兼容性) code
請注意如下幾點 orm
圖像源: MCTS Self-Paced Training Kit(考試70-432):Microsoft®SQLServer®2008 - 實施和維護第3章:表格 - >第1課:建立表格 - >第66頁 文檔
DATETIME2
的日期範圍爲「0001/01/01」至「9999/12/31」,而DATETIME
類型僅支持1753-9999年。 字符串
此外,若是您須要, DATETIME2
能夠在時間上更精確; DATETIME限制爲3 1/3毫秒,而DATETIME2
能夠精確到100ns。 部署
這兩種類型都映射到.NET中的System.DateTime
- 沒有區別。 get
若是您有選擇,我建議儘量使用DATETIME2
。 我沒有看到使用DATETIME
任何好處(向後兼容性除外) - 你會遇到更少的麻煩(日期超出範圍而且麻煩這樣)。 it
另外:若是您只須要日期(沒有時間部分),請使用DATE - 它與DATETIME2
同樣好,也能夠節省空間! :-)一樣只限時間 - 使用TIME
。 這就是這些類型的用途!
使用非美國DATEFORMAT
設置時,日期字符串到datetime
和datetime2
也可能不一樣。 例如
set dateformat dmy declare @d datetime, @d2 datetime2 select @d = '2013-06-05', @d2 = '2013-06-05' select @d, @d2
這將返回2013-05-06
(即五月六日)的datetime
,和2013-06-05
進行(即六月五日) datetime2
。 然而, dateformat
設置爲mdy
,既@d
和@d2
回報2013-06-05
。
datetime
行爲彷佛與SET DATEFORMAT
的MSDN文檔不一致,後者指出: 某些字符串格式(例如ISO 8601)的解釋與DATEFORMAT設置無關 。 顯然不是真的!
直到我被這個咬了,我老是認爲yyyy-mm-dd
日期只會被正確處理,不管語言/語言環境設置如何。
datetime的MSDN文檔建議使用datetime2 。 如下是他們的建議:
使用
time
,date
,datetime2
和datetimeoffset
數據類型進行新工做。 這些類型與SQL標準一致。 它們更便攜。time
,datetime2
和datetimeoffset
提供更多的秒精度。datetimeoffset
爲全局部署的應用程序提供時區支持。
datetime2具備更大的日期範圍,更大的默認小數精度和可選的用戶指定精度。 此外,根據用戶指定的精度,它可能使用較少的存儲空間。
我認爲DATETIME2
是存儲date
的更好方法,由於它比DATETIME
具備更高的效率。 在SQL Server 2008
您可使用DATETIME2
,它存儲日期和時間,須要6-8 bytes
進行存儲,精度爲100 nanoseconds
。 因此任何須要更高時間精度的人都須要DATETIME2
。