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

13

Zastanawiałem się, jaka jest różnica między następującymi dwiema metodami:

 GETUTCDATE()-2  

i

  DATEADD(d,-2,GETUTCDATE())

Wydaje mi się, że używanie DATEADDjest poprawne, ale zastanawiałem się, dlaczego?

Nowicjusz
źródło

Odpowiedzi:

14

Nie ma tam prawdziwej różnicy, ale kiedy zaczniesz używać DATETIME2wartości lub funkcji, które zwracają DATETIME2wartości, będziesz otrzymywać błędy.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Msg 206, poziom 16, stan 2, wiersz 17 Zderzenie typu argumentu: datetime2 jest niezgodny z int

W tym celu musisz użyć funkcji matematycznych daty.

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

Aaron Bertrand krótko omawia ten problem w swojej serii Bad Habits to Kick .

Erik Darling
źródło
8

W przeciwieństwie do twierdzeń zawartych w jednej z pozostałych odpowiedzi, obie opcje są oficjalnie obsługiwane i dokumentowane przez SQL Server: datetime - numbernie jest to zachowanie niezdefiniowane.

Dużą zaletą

DATEADD(d, -2, GETUTCDATE())

jest fakt, że jest to samo dokumentowanie : jego cel jest natychmiast oczywisty.

GETUTCDATE() - 2z drugiej strony polega na tym, że czytelnik zna definicję datetime - numberoperacji. Tak, może to być obecnie idiomatyczny T-SQL, ale fakt, że nie jest on już obsługiwany, datetime2oznacza, że ​​przyszłe pokolenia programistów SQL Server mogą nie być już z nim zaznajomione.

Heinzi
źródło
Jest tu wyraźniej określone: Operatory arytmetyczne (Transact-SQL)Operatory plus (+) i minus (-) mogą być również używane do wykonywania operacji arytmetycznych na wartościach datetime i smalldatetime .
ypercubeᵀᴹ
@ ypercubeᵀᴹ: Pierwszy wiersz - (Odejmij) (Transact-SQL) jest jeszcze bardziej wyraźny względem jednostki (dni): „Odejmuje dwie liczby (operator odejmowania arytmetycznego). Może również odjąć liczbę, w dniach, od daty .
Heinzi
tak, widziałem to. A potem później, że „Nie można używać z typami danych data, godzina, datetime2 lub datetimeoffset”. Tak więc „data” w pierwszym zdaniu oznacza dowolny typ daty / godziny, z wyjątkiem tych, które są zabronione (a więc tylko datetime i smalldatetime, w zasadzie typy dat, które istniały przed datedodaną wersją 2008 (?) ). Jest trochę niechlujny.
ypercubeᵀᴹ
Być może to kolejna rzecz, którą możesz dodać w swojej odpowiedzi. Fakt, że ten operator nie obsługuje nowych typów sugeruje, że został zachowany tylko ze względu na kompatybilność wsteczną.
ypercubeᵀᴹ