Wie hat Microsoft alternativ Zeitreisen ermöglicht?
Betrachten Sie diesen Code:
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
ist vorher eingestellt @UTC
, hat aber manchmal einen späteren Wert. (Ich habe dies unter SQL Server 2008 R2 und SQL Server 2016 versucht. Sie müssen es einige Male ausführen, um die verdächtigen Vorkommen zu erkennen.)
Dies scheint nicht nur eine Frage der Rundung oder der Ungenauigkeit zu sein. (Tatsächlich denke ich, dass die Rundung das Problem gelegentlich "behebt".) Die Werte für einen Probelauf lauten wie folgt:
- Offset
- 2017-06-07 12: 01: 58.8801139 -05: 00
- koordinierte Weltzeit
- 2017-06-07 17: 01: 58.877
- UTC vom Versatz:
- 2017-06-07 17: 01: 58.880
Die Datums- / Uhrzeitgenauigkeit erlaubt also die .880 als gültigen Wert.
Selbst die GETUTCDATE-Beispiele von Microsoft zeigen, dass die SYS * -Werte später als die älteren Methoden sind, obwohl sie zuvor ausgewählt wurden :
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 */
Ich nehme an, das liegt daran, dass sie aus verschiedenen zugrunde liegenden Systeminformationen stammen. Kann jemand Details bestätigen und angeben?
In der SYSDATETIMEOFFSET-Dokumentation von Microsoft heißt es: "SQL Server ermittelt die Datums- und Zeitwerte mithilfe der Windows-API GetSystemTimeAsFileTime ()" (danke srutzky). Die GETUTCDATE-Dokumentation ist jedoch viel weniger spezifisch und besagt nur, dass der Wert vom Betriebssystem des Betriebssystems abgeleitet ist Computer, auf dem die Instanz von SQL Server ausgeführt wird ".
(Dies ist nicht ganz akademisch. Ich bin auf ein kleines Problem gestoßen, das dadurch verursacht wurde. Ich habe einige Verfahren aktualisiert, um SYSDATETIMEOFFSET anstelle von GETUTCDATE zu verwenden, in der Hoffnung auf eine größere Präzision in der Zukunft, aber ich bekam merkwürdige Bestellungen, weil andere Verfahren dies waren Ich benutze immer noch GETUTCDATE und "springe" gelegentlich meinen konvertierten Prozeduren in den Protokollen voraus.)