DATEADD-Fallstricke bei großen Ganzzahlen
Beim Arbeiten mit großen Ganzzahl-Zeitstempeln kann die DATEADD-Funktion in SQL Server auf Einschränkungen stoßen. In diesem Artikel wird ein konkreter Fall untersucht, bei dem ein großer ganzzahliger Wert einen arithmetischen Überlauffehler verursacht.
Problem
Betrachten Sie die folgende SQL-Anweisung, die dazu gedacht ist, einen großen JavaScript-Zeitstempel in zu konvertieren ein SQL-Datum:
DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))
Auf SQL Server 2008 führt die Ausführung dieser Anweisung zu einem „Arithmetic Überlauffehler beim Konvertieren des Ausdrucks in den Datentyp int.“
Lösung
Der Schlüssel zur Behebung dieses Fehlers liegt in der Aufteilung der DATEADD-Operation in kleinere Teile. Indem wir zunächst die Zeit in größeren Einheiten (z. B. Sekunden oder Minuten) hinzufügen und dann die verbleibenden Millisekunden hinzufügen, können wir den Überlauf vermeiden.
Zum Beispiel berechnet die folgende Anweisung die Startzeit bei einer großen Dauer (in Millisekunden):
DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
In diesem Beispiel werden zunächst die Minuten von der großen Dauer subtrahiert und dann die verbleibenden Millisekunden addiert. Dieser Ansatz stellt sicher, dass die Zwischenberechnungen nicht überlaufen.
Das obige ist der detaillierte Inhalt vonSQL Server DATEADD: Wie vermeide ich einen arithmetischen Überlauf mit großen ganzzahligen Zeitstempeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!