Ich versuche, eine Zeichenfolge in (in SQL Server) über einen ETL-Auftrag zu konvertieren. Im Grunde würde meine Zeichenfolge ungefähr wie '2017-10-15' aussehen und ich möchte, dass diese in eine DatetimeOffset
(vom aktuellen DB-Server) umgewandelt wird.SQL Server DateDiff zwischen zwei Datumsangaben gibt ungenaue Werte zurück
SELECT
SWITCHOFFSET(DATEADD(mi, DATEDIFF(MI, GETDATE(), GETUTCDATE()), CAST(@DateInString + ' 00:00:00' AS DATETIMEOFFSET)), DATENAME(tzoffset, SYSDATETIMEOFFSET()))
Ich habe mit dieser Aussage einige seltsame Probleme bekommen wie die endgültige Ausgabe entweder +1/-1 Minute als den erwarteten fallen würde. Dies geschieht für mindestens alle 10 Datensätze/Millionen. Ich versuchte, das Problem zu nageln, und ich konnte das Problem mit der DATEDIFF()
Methode sehen, die +/- 1 Minute zurückbringt.
Dies sollte genau -600 zurückgeben (da mein DB-Server UTC +10 ist). Für einige Datensätze wird jedoch entweder -599 oder 601 zurückgegeben. Ich führe sie als einzelne Select-Anweisung in meiner Stored Procedure aus und gebe sie als Parameter zurück.
Dies ist seltsam, wie SQL zwei unterschiedliche Datetime-Werte für GETDATE()
und auf der gleichen SELECT-Anweisung erkennen konnte.
Gibt es eine Möglichkeit, SQL zu zwingen, genau dieselben Daten in diesen DATEDIFF
Parametern zu erhalten, oder fehle ich hier etwas? Vielen Dank im Voraus
Ich benutze SQL Server 2014 (v12.0).
Stored Procedure:
CREATE PROCEDURE dbo.SPConvertDateTimeOffset
@DateInString VARCHAR(10),
@DateTimeOffset_Value DATETIMEOFFSET OUTPUT,
@Datediff_Value INT OUTPUT
AS
BEGIN
-- This line returns +/- 1
SELECT @Datediff_Value = DATEDIFF(MI, GETDATE(), GETUTCDATE())
SELECT @DateTimeOffset_Value = SWITCHOFFSET(DATEADD(mi, @Datediff_Value, CAST(@DateInString + ' 00:00:00' AS DATETIMEOFFSET)), DATENAME(tzoffset, SYSDATETIMEOFFSET()))
END
Wenn Sie dies viele, viele Male tun, dann sind 'getdate()' und 'getutcdate()' möglicherweise um einige Millisekunden aus. –
Spielt es wirklich eine Rolle? Weil, ich bekomme das datediff nur für den Minutenteil. Auch wenn ich es mehrmals mache, sollte es mir idealerweise den gleichen Datetime-Wert geben. Haben Sie jedoch einen Hinweis darauf, warum es Unterschiede in Millisekunden gibt, wenn ich es mehrmals mache? – Bharathi
Es kann wichtig sein, weil 'datediff()' * Grenzen * zwischen den Zeiten misst. –