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

13

Me preguntaba cuál es la diferencia entre los siguientes dos métodos:

 GETUTCDATE()-2  

y

  DATEADD(d,-2,GETUTCDATE())

Supongo que usar DATEADDes la forma correcta, pero me preguntaba por qué.

novato
fuente

Respuestas:

14

No hay una diferencia real allí, pero cuando comienzas a usar DATETIME2valores o funciones que devuelven DATETIME2valores, obtendrás errores.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Mensaje 206, Nivel 16, Estado 2, Línea 17 Tipo de operando choque: datetime2 es incompatible con int

Para esto, debe usar las funciones matemáticas de fecha.

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

Aaron Bertrand habla sobre este tema brevemente en su serie Bad Habits to Kick .

Erik Darling
fuente
8

Contrario a las afirmaciones en una de las otras respuestas, ambas opciones son soportadas oficialmente y documentados por SQL Server: datetime - numberes no un comportamiento indefinido.

La gran ventaja de

DATEADD(d, -2, GETUTCDATE())

es el hecho de que se documenta por sí mismo : su propósito es inmediatamente obvio.

GETUTCDATE() - 2, por otro lado, confía en que el lector conozca la definición de la datetime - numberoperación. Sí, actualmente puede ser T-SQL idiomático, pero el hecho de que esto ya no sea compatible datetime2implica que las generaciones futuras de desarrolladores de SQL Server ya no estén familiarizados con él.

Heinzi
fuente
Se manifestó de forma más explícita aquí: Operadores aritméticos (Transact-SQL) " El signo más (+) y menos (-) Los operadores también pueden ser utilizados para realizar operaciones aritméticas sobre datetime y smalldatetime valores. "
ypercubeᵀᴹ
@ ypercubeᵀᴹ: La primera línea de - (Restar) (Transact-SQL) es aún más explícita wrt la unidad (días): "Resta dos números (un operador de resta aritmética). También puede restar un número, en días, de una fecha . "
Heinzi
si, lo ví. Y luego más tarde que "No se puede usar con los tipos de datos de fecha, hora, datetime2 o datetimeoffset". Entonces, la "fecha" en la primera oración significa cualquier tipo de fecha / hora, excepto aquellos que están prohibidos (por lo tanto, solo datetime y smalldatetime, básicamente los tipos de fecha y hora que existían antes de la versión 2008 (?) Que datese agregó). Es un poco desordenado
ypercubeᵀᴹ
Quizás esa sea otra cosa que puede agregar en su respuesta. El hecho de que este operador no sea compatible con los nuevos tipos sugiere que se ha mantenido solo por razones de compatibilidad con versiones anteriores.
ypercubeᵀᴹ