另外,Microsoft如何使时间旅行成为可能?
考虑以下代码:
DECLARE @Offset datetimeoffset = sysdatetimeoffset();
DECLARE @UTC datetime = getUTCdate();
DECLARE @UTCFromOffset datetime = CONVERT(datetime,SWITCHOFFSET(@Offset,0));
SELECT
Offset = @Offset,
UTC = @UTC,
UTCFromOffset = @UTCFromOffset,
TimeTravelPossible = CASE WHEN @UTC < @UTCFromOffset THEN 1 ELSE 0 END;
@Offset
设置在之前 @UTC
,但有时值更高。(我已在SQL Server 2008 R2和SQL Server 2016上尝试过此操作。您必须运行几次以捕获可疑事件。)
这似乎不只是舍入或缺乏精度的问题。(实际上,我认为四舍五入是偶尔“解决”该问题的原因。)样本运行的值如下:
- 偏移量
- 2017-06-07 12:01:58.8801139 -05:00
- 世界标准时间
- 2017-06-07 17:01:58.877
- UTC偏移量:
- 2017-06-07 17:01:58.880
因此,日期时间精度允许.880作为有效值。
即使是微软的GETUTCDATE例子显示SYS *值是以后,比老方法,尽管被选中前面:
SELECT 'SYSDATETIME() ', SYSDATETIME(); SELECT 'SYSDATETIMEOFFSET()', SYSDATETIMEOFFSET(); SELECT 'SYSUTCDATETIME() ', SYSUTCDATETIME(); SELECT 'CURRENT_TIMESTAMP ', CURRENT_TIMESTAMP; SELECT 'GETDATE() ', GETDATE(); SELECT 'GETUTCDATE() ', GETUTCDATE(); /* Returned: SYSDATETIME() 2007-05-03 18:34:11.9351421 SYSDATETIMEOFFSET() 2007-05-03 18:34:11.9351421 -07:00 SYSUTCDATETIME() 2007-05-04 01:34:11.9351421 CURRENT_TIMESTAMP 2007-05-03 18:34:11.933 GETDATE() 2007-05-03 18:34:11.933 GETUTCDATE() 2007-05-04 01:34:11.933 */
我认为这是因为它们来自不同的基础系统信息。谁能确认并提供详细信息?
微软的SYSDATETIMEOFFSET文档说“ SQL Server通过使用GetSystemTimeAsFileTime()Windows API获得日期和时间值”(感谢srutzky),但是他们的GETUTCDATE文档没有那么具体,只说“值是从Windows 的操作系统派生的”。运行SQL Server实例的计算机”。
(这不完全是学术性的。因此,我遇到了一个小问题。我正在升级一些过程以使用SYSDATETIMEOFFSET而不是GETUTCDATE,以期将来获得更高的精度,但是由于其他过程被使用,我开始变得奇怪。仍在使用GETUTCDATE,并偶尔在日志中“跳过”转换后的过程。)