Jika Anda perlu menemukan perbedaan antara dua tanggal di SQL Server, Anda mungkin telah menggunakan DATEDIFF()
fungsi. Fungsi ini mengembalikan jumlah waktu antara dua tanggal menggunakan datepart ditentukan oleh Anda. Misalnya, Anda dapat menggunakannya untuk menampilkan jumlah hari antara tanggal 1 dan tanggal 2. Anda juga dapat menggunakannya untuk menampilkan jumlah menit, detik, bulan, tahun, dll.
DATEDIFF_BIG()
fungsinya bekerja dengan cara yang persis sama, tetapi dengan satu perbedaan kecil:tipe data pengembaliannya.
Jadi perbedaan antara kedua fungsi ini adalah tipe data dari nilai kembaliannya.
DATEDIFF()
mengembalikan bilangan bulat yang ditandatangani (int )DATEDIFF_BIG()
mengembalikan bilangan bulat besar yang ditandatangani (besar )
Dalam beberapa kasus, Anda tidak perlu banyak mengembalikan besar tipe data. Ini mewakili angka yang sangat besar, dan apakah Anda menggunakan DATEDIFF()
atau DATEDIFF_BIG()
tidak akan membuat perbedaan (kecuali untuk persyaratan penyimpanan – int menggunakan 4 byte, besar menggunakan 8 byte).
Namun, jika Anda mengalami kesalahan berikut:
Fungsi dateiff menghasilkan overflow. Jumlah bagian tanggal yang memisahkan dua contoh tanggal/waktu terlalu besar. Coba gunakan dateiff dengan bagian tanggal yang kurang tepat.
Itu karena nilai pengembaliannya terlalu besar.
Dalam hal ini, Anda perlu melakukan salah satu dari tiga hal berikut:
- Gunakan periode waktu yang lebih singkat. Misalnya, daripada mencoba mengembalikan jumlah milidetik dalam 26 hari, coba 25.
- Gunakan datepart yang kurang tepat . Misalnya, daripada mencoba mengembalikan jumlah milidetik, cobalah hanya dalam hitungan detik.
- Gunakan
DATEDIFF_BIG()
berfungsi sebagai gantinya.
Terkadang dua opsi pertama tidak cocok. Jika Anda membutuhkan rentang waktu 26 hari, 25 tidak akan memotongnya. Dan jika Anda memerlukan stempel waktu Unix setelah 2038, Anda akan menemui masalah 2038 jika Anda menggunakan DATEDIFF()
.
Bagaimanapun, DATEDIFF_BIG()
fungsi memungkinkan rentang hasil yang jauh lebih besar daripada DATEDIFF()
.
Contoh
Berikut adalah dua contoh untuk menunjukkan persamaan dan perbedaan antara DATEDIFF()
dan DATEDIFF_BIG()
.
Hasil yang Sama
Berikut adalah contoh di mana kedua fungsi menghasilkan hasil yang sama:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Hasil:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
Seperti yang diharapkan, kedua fungsi mengembalikan hasil yang sama. Ini karena nilai pengembalian cukup kecil untuk memenuhi keduanya besar dan int tipe data. Yang kami lakukan hanyalah mengembalikan jumlah milidetik dalam 1 detik.
Hasil Berbeda
Sekarang, inilah yang terjadi jika kita menambah jangka waktu menjadi 1000 tahun.
Pertama, inilah yang terjadi ketika kita menggunakan DATEDIFF()
:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
Hasil:
Error: The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
Nah, begini caranya DATEDIFF_BIG()
menanganinya:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Hasil:
DATEDIFF_BIG -------------- 31556908800000
Mengembalikan jumlah milidetik dalam 1000 tahun terlalu banyak untuk int , tapi itu bukan masalah bagi besar .