Trong SQL Server, bạn có thể sử dụng DATEDIFF_BIG()
thay vì DATEDIFF()
nếu bạn mong đợi giá trị trả về thực sự lớn. Ví dụ:nếu bạn đang cố gắng tìm xem có bao nhiêu mili giây trong 1000 năm, bạn sẽ gặp lỗi.
Đó là bởi vì DATEDIFF()
trả về một int kiểu dữ liệu và kết quả là quá lớn để loại dữ liệu đó có thể xử lý. Mặt khác, DATEDIFF_BIG()
hàm trả về bigint đã ký kiểu dữ liệu, có nghĩa là bạn có thể sử dụng nó để trả về các giá trị lớn hơn nhiều. Nói cách khác, bạn có thể sử dụng với phạm vi ngày lớn hơn nhiều.
Ngoài ra, thực sự không có bất kỳ sự khác biệt nào giữa hai chức năng.
Bài viết cung cấp các ví dụ về việc sử dụng DATEDIFF_BIG()
trong SQL Server.
Cú pháp
Đầu tiên, đây là cú pháp:
DATEDIFF_BIG ( 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.
Hàm trừ đi ngày bắt đầu từ enddate .
Cách hoạt động là nó trả về tổng số (dưới dạng giá trị số nguyên lớ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 .
Đây chính xác là cú pháp được sử dụng với DATEDIFF()
chức năng.
Ví dụ 1
Đây là một ví dụ cơ bản để chứng minh cách nó hoạt động.
SELECT DATEDIFF_BIG(day, '0001-01-01', '9002-01-01') AS Result;
Kết quả:
+----------+ | Result | |----------| | 3287547 | +----------+
Lưu ý rằng trong trường hợp này, chúng tôi có thể đã sử dụng DATEDIFF()
, vì kết quả không quá lớn đối với một số nguyên.
Ví dụ 2
Dưới đây là một ví dụ trong đó chúng tôi trả lại sự khác biệt của các thời điểm khác nhau từ hai ngày. Trong trường hợp này, 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()
chức năng thêm 1000 năm vào ngày đầu tiên):
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1000, @date1); SELECT DATEDIFF_BIG( year, @date1, @date2 ) AS Years, DATEDIFF_BIG( quarter, @date1, @date2 ) AS Quarters, DATEDIFF_BIG( month, @date1, @date2 ) AS Months, DATEDIFF_BIG( week, @date1, @date2 ) AS Weeks, DATEDIFF_BIG( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF_BIG( day, @date1, @date2 ) AS Days;
Kết quả:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1000 | 4000 | 12000 | 52178 | 365243 | 365243 | +---------+------------+----------+---------+-------------+--------+
Một lần nữa, chúng tôi có thể đã sử dụng DATEDIFF()
, bởi vì không có kết quả nào quá lớn đối với một số nguyên.
Ví dụ 3
Trong ví dụ này, chúng tôi trả về giờ, phút và giây giữa hai ngày:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1000, @date1); SELECT DATEDIFF_BIG( hour, @date1, @date2 ) AS Hours, DATEDIFF_BIG( minute, @date1, @date2 ) AS Minutes, DATEDIFF_BIG( second, @date1, @date2 ) AS Seconds;
Kết quả:
+---------+-----------+-------------+ | Hours | Minutes | Seconds | |---------+-----------+-------------| | 8765832 | 525949920 | 31556995200 | +---------+-----------+-------------+
Bây giờ chúng ta đang ở điểm mà DATEDIFF()
sẽ trả lại một lỗi. Số giây quá lớn đối với int (nhưng không phải đối với bigint ).
Ví dụ 4
Và cuối cùng, đây là một ví dụ với mili giây, micro giây và nano giây:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF_BIG( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF_BIG( nanosecond, @date1, @date2 ) AS Nanoseconds;
Kết quả:
+----------------+------------------+---------------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+------------------+---------------------| | 3155760000000 | 3155760000000000 | 3155760000000000000 | +----------------+------------------+---------------------+
Trong trường hợp này, chúng ta có thể thấy rõ lợi ích mà DATEDIFF_BIG()
có hơn DATEDIFF()
. DATEDIFF()
sẽ bị ngã ở cả ba.