Trong SQL Server, bạn có thể sử dụng T-SQL DATEDIFF()
hàm để trả về sự khác biệt giữa hai ngày / giờ. Nó hoạt động trên bất kỳ biểu thức nào có thể được giải quyết trong thời gian , ngày , smalldatetime , ngày giờ , datetime2 hoặc datetimeoffset giá trị.
Bài viết này cung cấp các ví dụ về DATEDIFF()
trong SQL Server.
Cú pháp
Đầu tiên, đây là cú pháp:
DATEDIFF ( datepart , startdate , enddate )
Nơi datepart là phần của ngày mà bạn muốn so sánh. ngày bắt đầu là ngày đầu tiên và ngày kết thúc là ngày kết thúc.
Cách hoạt động là nó trả về tổng số (dưới dạng giá trị số nguyên có dấu) của datepart được chỉ định ranh giới vượt qua giữa ngày bắt đầu được chỉ định và enddate .
Ví dụ 1
Dưới đây là một ví dụ cơ bản trong đó chúng tôi tìm ra số ngày giữa hai ngày:
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;
Kết quả:
+----------+ | Result | |----------| | 365 | +----------+
Ví dụ 2
Đây là một ví dụ khác mà tôi khai báo hai biến và gán hai ngày khác nhau cho chúng (Tôi sử dụng DATEADD()
thêm 1 năm vào ngày đầu tiên). Sau đó, tôi sử dụng DATEDIFF()
để trả lại các thời điểm khác nhau cho ngày đó:
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;
Kết quả:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366 | +---------+------------+----------+---------+-------------+--------+
Ví dụ 3
Như đã đề cập, bạn cũng có thể trả về các phần thời gian giữa các ngày. Dưới đây là một ví dụ về việc trả về số giờ, phút và giây giữa các giá trị ngày / giờ:
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;
Kết quả:
+---------+-----------+-----------+ | Hours | Minutes | Seconds | |---------+-----------+-----------| | 1 | 60 | 3600 | +---------+-----------+-----------+
Ví dụ 4
Và đây là một ví dụ về việc lấy số mili giây, micro giây và nano giây giữa hai giá trị ngày / giờ:
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;
Kết quả:
+----------------+----------------+---------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+----------------+---------------| | 1 | 1000 | 1000000 | +----------------+----------------+---------------+
Ví dụ 5 - Lỗi!
Nếu bạn cố gắng làm điều gì đó cực đoan, chẳng hạn như trả lại số nano giây trong 100 năm, bạn sẽ gặp lỗi. Điều này là do DATEDIFF()
trả về một int và có nhiều nano giây hơn trong 100 năm so với int kiểu dữ liệu có thể xử lý.
Vì vậy, đây là những gì sẽ xảy ra nếu bạn cố gắng làm điều đó:
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;
Kết quả:
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.
May mắn thay, nếu bạn thực sự phải tìm ra bao nhiêu nano giây trong 100 năm, bạn có thể sử dụng DATEDIFF_BIG()
chức năng thay thế. Hàm này trả về bigint đã ký kiểu dữ liệu, cho phép bạn trả về các giá trị lớn hơn nhiều so với DATEDIFF()
có thể.
Ví dụ 6 - Nhận được kết quả kỳ lạ?
Kết quả bạn nhận được từ DATEDIFF()
đôi khi có thể nhìn sai hoàn toàn nếu bạn không biết chức năng thực sự hoạt động như thế nào.
Ví dụ:
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;
Kết quả:
+--------+---------+ | Days | Years | |--------+---------| | 365 | 0 | +--------+---------+
Nếu bạn không biết cách làm DATEDIFF()
thực sự hoạt động, kết quả này có thể trông sai đến mức bạn sẽ được tha thứ nếu cho rằng đó là lỗi. Nhưng nó không phải là một lỗi.
Kiểm tra DATEDIFF () Trả về Kết quả Sai trong SQL Server? Đọc này. để xem ví dụ này và các trường hợp khác trong đó kết quả có thể hoàn toàn sai, nhưng hoàn toàn đúng (và để biết giải thích tại sao chúng lại giống như cách chúng làm).
Một trong những ví dụ trên trang đó có lẽ đáng được nhắc lại ở đây. DATEDIFF()
thực sự bỏ qua SET DATEFIRST
của bạn giá trị. Điều này có thể dẫn đến kết quả không mong muốn, đặc biệt nếu bạn ở trong một nền văn hóa không sử dụng Chủ nhật là ngày đầu tiên trong tuần. Hãy xem Cách giải quyết này cho DATEDIFF () Bỏ qua SET DATEFIRST trong SQL Server nếu bạn cho rằng điều này có thể ảnh hưởng đến bạn.