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

13

Je me demandais quelle est la différence entre les deux méthodes suivantes:

 GETUTCDATE()-2  

et

  DATEADD(d,-2,GETUTCDATE())

Je suppose que l'utilisation DATEADDest la bonne façon, mais je me demandais pourquoi?

débutant
la source

Réponses:

14

Il n'y a pas vraiment de différence, mais lorsque vous commencez à utiliser des DATETIME2valeurs ou des fonctions qui renvoient des DATETIME2valeurs, vous obtenez des erreurs.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Msg 206, niveau 16, état 2, ligne 17 Type d'opérande en conflit: datetime2 est incompatible avec int

Pour ceux-ci, vous devez utiliser des fonctions mathématiques de date.

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

Aaron Bertrand parle brièvement de ce problème dans sa série Bad Habits to Kick .

Erik Darling
la source
8

Contrairement aux affirmations de l'une des autres réponses, les deux options sont officiellement prises en charge et documentées par SQL Server: datetime - numberce n'est pas un comportement indéfini.

Le gros avantage de

DATEADD(d, -2, GETUTCDATE())

est le fait qu'il est auto-documenté : Son but est immédiatement évident.

GETUTCDATE() - 2, d'autre part, repose sur le lecteur connaissant la définition de l' datetime - numberopération. Oui, il pourrait être actuellement T-SQL idiomatique, mais le fait qu'il ne soit plus pris en charge datetime2implique que les générations futures de développeurs SQL Server pourraient ne plus le connaître.

Heinzi
la source
Il est plus explicitement indiqué ici: Opérateurs arithmétiques (Transact-SQL) " Les opérateurs plus (+) et moins (-) peuvent également être utilisés pour effectuer des opérations arithmétiques sur les valeurs datetime et smalldatetime . "
ypercubeᵀᴹ
@ ypercubeᵀᴹ: La première ligne de - (Soustraire) (Transact-SQL) est encore plus explicite par rapport à l'unité (jours): "Soustrait deux nombres (un opérateur de soustraction arithmétique). Peut également soustraire un nombre, en jours, d'une date . "
Heinzi
Oui j'ai vu ça. Et puis plus tard que "Ne peut pas être utilisé avec les types de données date, heure, datetime2 ou datetimeoffset." Ainsi, la "date" dans la première phrase signifie tout type de date / heure à l'exception de ceux qui sont interdits (donc uniquement datetime et smalldatetime, essentiellement les types datetime qui existaient avant la version 2008 (?) Qui a dateété ajoutée). C'est un peu désordonné.
ypercubeᵀᴹ
C'est peut-être une autre chose que vous pouvez ajouter dans votre réponse. Le fait que cet opérateur ne supporte pas les nouveaux types suggère qu'il n'a été conservé que pour des raisons de compatibilité descendante.
ypercubeᵀᴹ