DATEDIFF_BIG (T-SQL)
Berlaku untuk: SQL Server 2016 (13.x) dan Azure SQL Database Azure SQL Managed Instance yang lebih baru
Fungsi ini mengembalikan hitungan (sebagai nilai bilangan bulat besar yang ditandatangani) dari batas datepart yang ditentukan yang disilangkan antara tanggal mulai dan akhir yang ditentukan.
Lihat Jenis dan Fungsi Data Tanggal dan Waktu (Transact-SQL) untuk gambaran umum semua jenis dan fungsi data tanggal dan waktu Transact-SQL.
Sintaks
DATEDIFF_BIG ( datepart , startdate , enddate )
Argumen
datepart
Bagian dari startdate dan enddate yang menentukan jenis batas yang disilangkan.
Catatan
DATEDIFF_BIG
tidak akan menerima nilai datepart dari variabel yang ditentukan pengguna atau sebagai string yang dikutip.
Tabel ini mencantumkan semua nama argumen dan singkatan datepart yang valid.
nama datepart | singkatan datepart |
---|---|
tahun | yy, yyyy |
kuartal | qq, q |
bulan | mm, m |
dayofyear | dy, y |
hari | dd, d |
minggu | wk, ww |
jam | hh |
menit | mi, n |
detik | ss, s |
milidetik | ms |
mikrosecond | Mcs |
nanodetik | Ns |
Catatan
Setiap nama dan singkatan datepart tertentu untuk nama datepart tersebut akan mengembalikan nilai yang sama.
startdate
Ekspresi yang bisa diatasi ke salah satu nilai berikut ini:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Untuk tanggal, DATEDIFF_BIG
akan menerima ekspresi kolom, ekspresi, string literal, atau variabel yang ditentukan pengguna. Nilai literal string harus diselesaikan ke tanggalwaktu. Gunakan empat digit tahun untuk menghindari masalah ambiguitas. DATEDIFF_BIG
mengurangi dimulai dari tanggal berakhir. Untuk menghindari ambiguitas, gunakan tahun empat digit. Lihat Mengonfigurasi Opsi Konfigurasi Server cutoff dua digit tahun untuk informasi tentang tahun dua digit.
enddate
Lihat mulai.
Jenis Hasil
Bigint yang ditandatangani
Tampilkan Nilai
Mengembalikan perbedaan bigint antara tanggal mulai dan berakhir, yang dinyatakan dalam batas yang ditetapkan oleh datepart.
Untuk nilai pengembalian di luar rentang untuk bigint (-9.223.372.036.854.775.808 hingga 9.223.372.036.854.775.807), DATEDIFF_BIG
mengembalikan kesalahan. Tidak seperti , yang mengembalikan int dan oleh karena itu dapat meluap satu menit atau lebih tinggi, DATEDIFF_BIG
hanya dapat meluap jika menggunakan presisi nanodetik di mana perbedaan antara enddate dan startdate lebih dari 292 tahun, 3 bulan, 10 hari, 23 jam, 47 menit, dan 16,8547758 detik.
Jika startdate dan enddate keduanya hanya ditetapkan nilai waktu, dan datepart bukan time datepart, DATEDIFF_BIG
mengembalikan 0.
DATEDIFF_BIG
menggunakan komponen offset zona waktu dari tanggal mulai atau berakhir untuk menghitung nilai yang dikembalikan.
Untuk nilai smalldatetime yang digunakan untuk startdate atau enddate, DATEDIFF_BIG
selalu atur detik dan milidetik ke 0 dalam nilai pengembalian karena smalldatetime hanya memiliki akurasi hingga menit.
Jika hanya nilai waktu yang ditetapkan ke variabel jenis data tanggal, DATEDIFF_BIG
atur nilai bagian tanggal yang hilang ke nilai default: 1900-01-01
. Jika hanya nilai tanggal yang ditetapkan ke variabel jenis data waktu atau tanggal, DATEDIFF_BIG
atur nilai bagian waktu yang hilang ke nilai default: 00:00:00
. Jika startdate atau enddate hanya memiliki bagian waktu dan yang lainnya hanya bagian tanggal, DATEDIFF_BIG
mengatur bagian waktu dan tanggal yang hilang ke nilai default.
Jika startdate dan enddate memiliki jenis data tanggal yang berbeda, dan satu memiliki lebih banyak bagian waktu atau presisi detik pecahan daripada yang lain, DATEDIFF_BIG
mengatur bagian yang hilang dari yang lain ke 0.
batas datepart
Pernyataan berikut memiliki nilai startdate dan enddate yang sama. Tanggal tersebut berdekatan dan berbeda dalam waktu seratus nanodetik (.0000001 detik). Perbedaan antara tanggal mulai dan berakhir di setiap pernyataan melewati satu kalender atau batas waktu dari datepart-nya. Setiap pernyataan mengembalikan 1. Jika tanggal mulai dan berakhir memiliki nilai tahun yang berbeda tetapi memiliki nilai minggu kalender yang sama, DATEDIFF_BIG
akan mengembalikan 0 untuk minggu datepart.
SELECT DATEDIFF_BIG(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
Keterangan
Gunakan DATEDIFF_BIG
dalam SELECT <list>
klausa , WHERE
, HAVING
, GROUP BY
dan ORDER BY
.
DATEDIFF_BIG
secara implisit melemparkan literal string sebagai jenis datetime2 . Ini berarti bahwa DATEDIFF_BIG
tidak mendukung format YDM saat tanggal diteruskan sebagai string. Anda harus secara eksplisit mentransmisikan string ke jenis datetime atau smalldatetime untuk menggunakan format YDM.
Menentukan SET DATEFIRST
tidak berpengaruh pada DATEDIFF_BIG
. DATEDIFF_BIG
selalu menggunakan Hari Minggu sebagai hari pertama dalam seminggu untuk memastikan fungsi beroperasi dengan cara deterministik.
DATEDIFF_BIG
dapat meluap dengan nanodetik jika perbedaan antara enddate dan startdate mengembalikan nilai yang berada di luar rentang untuk bigint.
Contoh
Menentukan kolom untuk tanggal mulai dan berakhir
Contoh ini menggunakan berbagai jenis ekspresi sebagai argumen untuk parameter startdate dan enddate . Ini menghitung jumlah batas hari yang disilangkan di antara tanggal dalam dua kolom tabel.
CREATE TABLE dbo.Duration
(startDate datetime2, endDate datetime2);
INSERT INTO dbo.Duration(startDate,endDate)
VALUES('2007-05-06 12:10:09', '2007-05-07 12:10:09');
SELECT DATEDIFF_BIG(day, startDate, endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1
Menemukan perbedaan antara tanggal mulai dan berakhir sebagai string bagian tanggal
DECLARE @date1 DATETIME2, @date2 DATETIME2, @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT, @seconds BIGINT, @milliseconds BIGINT
SET @date1 = '0001-01-01 00:00:00.00000000'
SET @date2 = '2018-12-12 07:08:01.12345678'
SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)
SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)
SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)
SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)
SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)
SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)
SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)
SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
+ ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')
+ ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
+ ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
+ ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
+ ISNULL(' ' + CAST(@seconds AS VARCHAR(10))
+ CASE WHEN @milliseconds > 0 THEN '.' + CAST(@milliseconds AS VARCHAR(10))
ELSE '' END
+ ' seconds','')
SELECT @result
Berikut set hasilnya.
2017 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Lihat contoh terkait lebih dekat di DATEDIFF (Transact-SQL).