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

13

Saya bertanya-tanya apa perbedaan antara dua metode berikut:

 GETUTCDATE()-2  

dan

  DATEADD(d,-2,GETUTCDATE())

Saya kira menggunakan DATEADDadalah cara yang benar, tetapi bertanya-tanya mengapa?

pemula
sumber

Jawaban:

14

Tidak ada perbedaan nyata di sana, tetapi ketika Anda mulai menggunakan DATETIME2nilai, atau fungsi yang mengembalikan DATETIME2nilai, Anda akan mendapatkan kesalahan.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Msg 206, Level 16, State 2, Line 17 Operan tipe clash: datetime2 tidak kompatibel dengan int

Untuk ini, Anda harus menggunakan fungsi matematika tanggal.

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

Aaron Bertrand berbicara tentang masalah ini secara singkat dalam seri Bad Habits to Kick .

Erik Darling
sumber
8

Bertentangan dengan klaim dalam salah satu jawaban lain, kedua opsi secara resmi didukung dan didokumentasikan oleh SQL Server: datetime - numberini bukan perilaku yang tidak terdefinisi.

Keuntungan besar

DATEADD(d, -2, GETUTCDATE())

adalah kenyataan bahwa itu adalah dokumentasi diri : Tujuannya segera jelas.

GETUTCDATE() - 2, di sisi lain, bergantung pada pembaca yang mengetahui definisi datetime - numberoperasi. Ya, saat ini mungkin T-SQL idiomatik, tetapi kenyataan bahwa ini tidak lagi didukung untuk datetime2menyiratkan bahwa generasi masa depan pengembang SQL Server mungkin tidak lagi mengenalnya.

Heinzi
sumber
Ini lebih eksplisit dinyatakan di sini: Operator Aritmatika (Transact-SQL) "Operator plus (+) dan minus (-) juga dapat digunakan untuk melakukan operasi aritmatika pada nilai datetime dan smalldatetime . "
ypercubeᵀᴹ
@ ypercubeᵀᴹ: Baris pertama - (Kurangi) (Transact-SQL) bahkan lebih eksplisit dengan unit (hari): "Kurangi dua angka (operator pengurangan aritmatika). Juga dapat mengurangi angka, dalam hari, dari tanggal . "
Heinzi
ya saya melihat itu. Dan kemudian bahwa "Tidak dapat digunakan dengan tipe data tanggal, waktu, datetime2, atau setel datetime." Jadi "tanggal" dalam kalimat pertama berarti jenis tanggal / waktu apa pun kecuali yang dilarang (jadi hanya datetime dan smalldatetime, pada dasarnya tipe datetime yang ada sebelum 2008 (?) Versi yang dateditambahkan). Agak berantakan.
ypercubeᵀᴹ
Mungkin itu hal lain yang bisa Anda tambahkan dalam jawaban Anda. Fakta bahwa operator ini tidak mendukung tipe baru menunjukkan bahwa ia disimpan hanya untuk alasan kompatibilitas ke belakang.
ypercubeᵀᴹ