今天在code review中看到如下语句:
ALTER TABLE dbo.MyTable ADD CreateDate DATETIME2(0) NOT NULL DEFAULT GETUTCDATE()
GETUTCDATE() 函数返回一个datetime
,然后将其填充到一个datetime2
列中。
这两种类型不同有什么意义吗?使用 SYSUTCDATETIME() 来创建一个datetime2
值会更好吗?
今天在code review中看到如下语句:
ALTER TABLE dbo.MyTable ADD CreateDate DATETIME2(0) NOT NULL DEFAULT GETUTCDATE()
GETUTCDATE() 函数返回一个datetime
,然后将其填充到一个datetime2
列中。
这两种类型不同有什么意义吗?使用 SYSUTCDATETIME() 来创建一个datetime2
值会更好吗?
您的列
CreateDate
用于DATETIME2(0)
日期定义。从表中检索值时,插入SYSUTCDATETIME()
or没有区别。GETUTCDATE()
让我们把你的表定义变成一个例子:
然后我们向表中添加一些值:
SYSUTCDATETIME()
让我们看看和 之间是否有区别GETUTCDATE()
:如您所见,插入
GETUTCDATE()
或SYSUTCDATETIME()
对存储的内容没有影响。这是因为列(如您的示例中所示)是使用DATETIME2(0)
默认精度定义的。DATETIME2(7)
如果我们创建一个包含 using 列(精度更高)的表并插入不同的值,那么我们会收到以下结果。首先我们创建表:
然后我们插入一些具有不同精度的日期时间值:
然后我们从表中选择值:
返回以下结果:
回答你的问题
CreateDate
在您的情况下不是,因为您使用低精度类型定义了列DATETIME2(0)
。在你的情况下不是,因为即使你会创建一个
DATETIME2
高精度的值,你也将它存储在一个DATETIME2(0)
精度较低的列中。如果您的问题是在插入数据时包含可能的性能影响......
那么当某些值被传递到列时可能会有轻微的开销。这是由于发生了隐式转换。这可以从执行计划中获得。
将日期插入
DATETIME2(0)
定义的列时,您可能会观察到将日期插入
DATETIME2(7)
定义的列时,您可能会观察到sysutcdatetime()
插入定义的列时,您不会观察到隐式转换DATETIME2(7)
。这是因为不必将值从一种日期时间格式转换为另一种格式。SYSUTCDATETIME()
将返回一个真正的DATETIME2(7)
格式化值。以下是包含转换的执行计划的屏幕截图
CONVERT_IMPLICIT
:可能的解决方案
如果您要使用存储更高精度值的
ALTER
列,那么您可以从切换到.DATETIME2(7)
DATETIME2
SYSUTCDATETIME()
如果您不需要这么高的精度,请考虑使用较低的值,因为这会在您的表中占用较少的存储空间:
参考资料