GETUTCDATE () - 2 gegen DATEADD (d, -2, GETUTCDATE ())

13

Ich habe mich gefragt, was der Unterschied zwischen den folgenden beiden Methoden ist:

 GETUTCDATE()-2  

und

  DATEADD(d,-2,GETUTCDATE())

Ich denke, die Verwendung DATEADDist der richtige Weg, aber ich habe mich gefragt, warum?

Neuling
quelle

Antworten:

14

Es gibt dort keinen wirklichen Unterschied, aber wenn Sie anfangen, DATETIME2Werte oder Funktionen zu verwenden, die DATETIME2Werte zurückgeben, werden Fehler angezeigt.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Meldung 206, Ebene 16, Status 2, Zeile 17 Kollision vom Operandentyp: datetime2 ist nicht mit int kompatibel

Für diese müssen Sie Datumsberechnungsfunktionen verwenden.

SELECT DATEADD(DAY, -1, SYSDATETIME()) AS [Compatible]

Aaron Bertrand spricht in seiner Serie Bad Habits to Kick kurz über dieses Problem .

Erik Darling
quelle
8

Im Gegensatz zu den Behauptungen in einer der anderen Antworten werden beide Optionen von SQL Server offiziell unterstützt und dokumentiert : datetime - numberEs handelt sich nicht um undefiniertes Verhalten.

Der große Vorteil von

DATEADD(d, -2, GETUTCDATE())

ist die Tatsache, dass es sich selbst dokumentiert : Sein Zweck ist sofort offensichtlich.

GETUTCDATE() - 2Auf der anderen Seite muss der Leser die Definition der datetime - numberOperation kennen. Ja, es könnte derzeit idiomatisches T-SQL sein, aber die Tatsache, dass dies nicht mehr unterstützt wird, datetime2impliziert, dass zukünftige Generationen von SQL Server-Entwicklern möglicherweise nicht mehr damit vertraut sind.

Heinzi
quelle
Es wird hier expliziter angegeben: Arithmetische Operatoren (Transact-SQL) " Die Plus- (+) und Minusoperatoren (-) können auch verwendet werden, um arithmetische Operationen für datetime- und smalldatetime- Werte auszuführen . "
ypercubeᵀᴹ
@ ypercubeᵀᴹ: Die erste Zeile von - (Subtrahieren) (Transact-SQL) ist für die Einheit (Tage) noch expliziter: "Subtrahiert zwei Zahlen (ein arithmetischer Subtraktionsoperator). Kann auch eine Zahl in Tagen von einem Datum subtrahieren . "
Heinzi
Ja, das habe ich gesehen. Und später: "Kann nicht mit Datentypen für Datum, Uhrzeit, Datum / Uhrzeit2 oder Datum / Zeitversatz verwendet werden." Das "Datum" im ersten Satz bedeutet also jeden Datums- / Uhrzeittyp mit Ausnahme derjenigen, die verboten sind (also nur Datums- und Kleinzeitangaben, im Grunde die Datums- und Uhrzeittypen, die vor der 2008 datehinzugefügten (?) Version existierten ). Es ist ein bisschen chaotisch.
Ypercubeᵀᴹ
Vielleicht können Sie dies auch in Ihre Antwort aufnehmen. Die Tatsache, dass dieser Operator die neuen Typen nicht unterstützt, deutet darauf hin, dass er nur aus Gründen der Abwärtskompatibilität beibehalten wurde.
Ypercubeᵀᴹ