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?

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 .


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.


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ᵀᴹ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.