Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() di SQL Server:Apa Bedanya?

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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat menyelesaikan konflik pemeriksaan antara SQL_Latin1_General_CP1_CI_AS dan Latin1_General_CI_AS dalam operasi yang sama

  2. SQL Server:Kiat Berguna untuk Pemula

  3. String split T-SQL

  4. Bagaimana cara menggunakan ROW_NUMBER()?

  5. Memperkenalkan Platform SaaS Pertama di Dunia untuk Memberikan Diagnostik Mendalam untuk Lingkungan SQL Server Hibrida