Bagikan melalui


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.

Konvensi sintaks 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_BIGmengurangi 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).

Lihat juga

CAST dan CONVERT (Transact-SQL)
DATEDIFF (T-SQL)