Di SQL Server, Anda dapat menggunakan T-SQL DATEDIFF()
berfungsi untuk mengembalikan perbedaan antara dua tanggal/waktu. Ini berfungsi pada ekspresi apa pun yang dapat diselesaikan ke waktu , tanggal , waktu kecil , waktu kencan , datetime2 , atau datetimeoffset nilai.
Artikel ini memberikan contoh DATEDIFF()
fungsi di SQL Server.
Sintaks
Pertama, inilah sintaksnya:
DATEDIFF ( datepart , startdate , enddate )
Dimana datepart adalah bagian dari tanggal yang ingin Anda bandingkan. tanggal mulai adalah tanggal pertama dan tanggal akhir adalah tanggal akhir.
Cara kerjanya adalah mengembalikan hitungan (sebagai nilai integer yang ditandatangani) dari datepart yang ditentukan batas dilintasi antara tanggal mulai yang ditentukan dan tanggal akhir .
Contoh 1
Berikut adalah contoh dasar di mana kami mengetahui jumlah hari antara dua tanggal:
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;
Hasil:
+----------+ | Result | |----------| | 365 | +----------+
Contoh 2
Berikut adalah contoh lain di mana saya mendeklarasikan dua variabel dan menetapkan dua tanggal yang berbeda untuk mereka (saya menggunakan DATEADD()
untuk menambahkan 1 tahun ke kencan pertama). Saya kemudian menggunakan DATEDIFF()
untuk mengembalikan berbagai bagian tanggal untuk tanggal tersebut:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1, @date1); SELECT DATEDIFF( year, @date1, @date2 ) AS Years, DATEDIFF( quarter, @date1, @date2 ) AS Quarters, DATEDIFF( month, @date1, @date2 ) AS Months, DATEDIFF( week, @date1, @date2 ) AS Weeks, DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF( day, @date1, @date2 ) AS Days;
Hasil:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366 | +---------+------------+----------+---------+-------------+--------+
Contoh 3
Seperti yang disebutkan, Anda juga dapat mengembalikan bagian waktu di antara tanggal. Berikut ini contoh mengembalikan jumlah jam, menit, dan detik di antara nilai tanggal/waktu:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1); SELECT DATEDIFF( hour, @date1, @date2 ) AS Hours, DATEDIFF( minute, @date1, @date2 ) AS Minutes, DATEDIFF( second, @date1, @date2 ) AS Seconds;
Hasil:
+---------+-----------+-----------+ | Hours | Minutes | Seconds | |---------+-----------+-----------| | 1 | 60 | 3600 | +---------+-----------+-----------+
Contoh 4
Dan berikut adalah contoh untuk mendapatkan jumlah milidetik, mikrodetik, dan nanodetik antara dua nilai tanggal/waktu:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
Hasil:
+----------------+----------------+---------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+----------------+---------------| | 1 | 1000 | 1000000 | +----------------+----------------+---------------+
Contoh 5 – Kesalahan!
Jika Anda mencoba melakukan sesuatu yang ekstrem, seperti mengembalikan jumlah nanodetik dalam 100 tahun, Anda akan mendapatkan kesalahan. Ini karena DATEDIFF()
mengembalikan int nilai, dan ada lebih banyak nanodetik dalam 100 tahun daripada int dapat ditangani oleh tipe data.
Jadi, inilah yang terjadi jika Anda mencoba melakukannya:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
Hasil:
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.
Untungnya, jika Anda benar-benar harus mencari tahu berapa nanodetik dalam 100 tahun, Anda dapat menggunakan DATEDIFF_BIG()
fungsi sebagai gantinya. Fungsi ini mengembalikan bigint . yang ditandatangani tipe data, yang memungkinkan Anda mengembalikan nilai yang jauh lebih besar daripada DATEDIFF()
bisa.
Contoh 6 – Mendapatkan Hasil yang Aneh?
Hasil yang Anda dapatkan dari DATEDIFF()
terkadang bisa terlihat sangat salah jika Anda tidak tahu bagaimana fungsi sebenarnya bekerja.
Misalnya:
DECLARE @startdate datetime2 = '2016-01-01 00:00:00.0000000', @enddate datetime2 = '2016-12-31 23:59:59.9999999'; SELECT DATEDIFF(day, @startdate, @enddate) Days, DATEDIFF(year, @startdate, @enddate) Years;
Hasil:
+--------+---------+ | Days | Years | |--------+---------| | 365 | 0 | +--------+---------+
Jika Anda tidak tahu caranya DATEDIFF()
benar-benar berfungsi, hasil ini bisa terlihat sangat salah, sehingga Anda akan dimaafkan jika menganggap itu bug. Tapi itu bukan bug.
Lihat DATEDIFF() Mengembalikan Hasil yang Salah di SQL Server? Baca ini. untuk melihat contoh ini dan kasus-kasus lain di mana hasilnya mungkin terlihat sangat salah, tetapi benar-benar benar (dan untuk penjelasan mengapa hasilnya terlihat seperti itu).
Salah satu contoh di halaman itu mungkin layak disebutkan lagi di sini. DATEDIFF()
sebenarnya mengabaikan SET DATEFIRST
nilai. Ini dapat menghasilkan hasil yang tidak terduga, terutama jika Anda berada dalam budaya yang tidak menggunakan hari Minggu sebagai hari pertama dalam seminggu. Lihat Solusi ini untuk DATEDIFF() Mengabaikan SET DATEFIRST di SQL Server jika menurut Anda ini dapat memengaruhi Anda.