哪个: 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
。