哪一个:
日期时间日期时间2
在SQL Server 2008+中存储日期和时间的建议方法是什么?
我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?
哪一个:
日期时间日期时间2
在SQL Server 2008+中存储日期和时间的建议方法是什么?
我知道精度(可能还有存储空间)的差异,但现在忽略这些,是否有关于何时使用what的最佳实践文档,或者我们应该只使用datetime2?
当前回答
datetime2在除(旧应用兼容性)之外的大多数方面都获胜
较大的值范围更好的准确性较小的存储空间(如果指定了可选的用户指定精度)
请注意以下几点
语法datetime2[(小数秒精度=>低于存储大小)]精度,刻度0至7位,精度为100ns。默认精度为7位数。存储大小精度小于3时为6字节;精度3和4为7字节。所有其他精度要求8字节。DateTime2(3)的位数与DateTime相同,但使用7字节的存储,而不是8字节(SQLHINTS-DateTime Vs DateTime2)查找有关datetime2的详细信息(Transact-SQL MSDN文章)
图像来源:MCTS自学训练套件(考试70-432):Microsoft®SQL Server®2008-实施和维护第3章:表格->第1课:创建表格->第66页
其他回答
Select ValidUntil + 1
from Documents
上面的SQL不适用于DateTime2字段。它返回错误“操作数类型冲突:datetime2与int不兼容”
添加1以获得第二天,这是开发人员多年来一直在使用日期的做法。现在微软有了一个超级新的datetime2字段,无法处理这个简单的功能。
“让我们使用比旧型号更糟糕的新型号”,我不这么认为!
下面的示例将向您展示smalldatetime、datetime、datetime2(0)和datetime2(7)之间存储大小(字节)和精度的差异:
DECLARE @temp TABLE (
sdt smalldatetime,
dt datetime,
dt20 datetime2(0),
dt27 datetime2(7)
)
INSERT @temp
SELECT getdate(),getdate(),getdate(),getdate()
SELECT sdt,DATALENGTH(sdt) as sdt_bytes,
dt,DATALENGTH(dt) as dt_bytes,
dt20,DATALENGTH(dt20) as dt20_bytes,
dt27, DATALENGTH(dt27) as dt27_bytes FROM @temp
返回
sdt sdt_bytes dt dt_bytes dt20 dt20_bytes dt27 dt27_bytes
------------------- --------- ----------------------- -------- ------------------- ---------- --------------------------- ----------
2015-09-11 11:26:00 4 2015-09-11 11:25:42.417 8 2015-09-11 11:25:42 6 2015-09-11 11:25:42.4170000 8
因此,如果我想将信息存储到秒,而不是毫秒,那么如果我使用datetime2(0)而不是datetime或datetime 2(7),我可以每个存储2个字节。
MSDN datetime文档建议使用datetime2。以下是他们的建议:
使用time、date、datetime2和新的datetimeoffset数据类型工作这些类型与SQL一致标准它们更便于携带。time、datetime2和datetimeoffset提供更多的秒精度。datetimeoffset提供时区支持全球部署应用。
datetime2具有更大的日期范围、更大的默认小数精度和可选的用户指定精度。还取决于用户指定的精度,它可能使用更少的存储空间。
正如其他答案所示,由于尺寸更小、精度更高,建议使用datetime2,但以下是Nikola Ilic关于为什么不使用datetime1的一些想法:
缺少(简单)对日期进行基本数学运算的可能性,如GETDATE()+1每次使用DATEADD或DATEDIFF进行比较时,都会完成到datetime的隐式数据转换SQL Server无法正确使用Datetime2列的统计信息,因为存储数据的方式会导致非最佳查询计划,从而降低性能
如果您是Access开发人员,试图将Now()写入相关字段,则DateTime2会造成严重破坏。刚刚执行了Access->SQL 2008 R2迁移,它将所有日期时间字段作为DateTime2放入。当值爆炸时,用Now()追加一条记录。2012年1月1日下午2:53:04没事,但2012年10月1日凌晨2:53:44没有。
一旦性格改变了。希望它能帮助到某人。