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


13

Mi chiedevo quale fosse la differenza tra i seguenti due metodi:

 GETUTCDATE()-2  

e

  DATEADD(d,-2,GETUTCDATE())

Immagino che usare DATEADDsia il modo corretto, ma mi chiedevo perché?

Risposte:


14

Non c'è alcuna vera differenza lì, ma quando inizi a utilizzare DATETIME2valori o funzioni che restituiscono DATETIME2valori, otterrai errori.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Messaggio 206, livello 16, stato 2, riga 17 Tipo di operando scontro: datetime2 non è compatibile con int

Per questi, devi usare le funzioni matematiche della data.

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

Aaron Bertrand parla brevemente di questo problema nella sua serie Bad Habits to Kick .


8

Contrariamente a quanto affermato in una delle altre risposte, entrambe le opzioni sono ufficialmente supportati e documentati da SQL Server: datetime - numberè non è un comportamento indefinito.

Il grande vantaggio di

DATEADD(d, -2, GETUTCDATE())

è il fatto che è auto-documentante : il suo scopo è immediatamente ovvio.

GETUTCDATE() - 2d'altra parte, si affida al lettore che conosce la definizione datetime - numberdell'operazione. Sì, al momento potrebbe essere T-SQL idiomatico, ma il fatto che questo non sia più supportato datetime2implica che le generazioni future di sviluppatori di SQL Server potrebbero non conoscerlo più.


Qui è più esplicitamente indicato: Operatori aritmetici (Transact-SQL) " Gli operatori più (+) e meno (-) possono anche essere usati per eseguire operazioni aritmetiche su valori datetime e smalldatetime . "
ypercubeᵀᴹ

@ ypercubeᵀᴹ: la prima riga di - (Sottrai) (Transact-SQL) è ancora più esplicita rispetto all'unità (giorni): "Sottrae due numeri (un operatore di sottrazione aritmetica). Può anche sottrarre un numero, in giorni, da una data . "
Heinzi

si l'ho visto. E più tardi che "Non può essere utilizzato con tipi di dati data, ora, datetime2 o datetimeoffset". Quindi la "data" nella prima frase indica qualsiasi tipo di data / ora eccetto quelli vietati (quindi solo datetime e smalldatetime, fondamentalmente i tipi di datetime che esistevano prima della versione del 2008 (?) Che è datestata aggiunta). È un po 'disordinato.
ypercubeᵀᴹ

Forse è un'altra cosa che puoi aggiungere nella tua risposta. Il fatto che questo operatore non supporti i nuovi tipi suggerisce che è stato mantenuto solo per motivi di compatibilità con le versioni precedenti.
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.