Nếu bạn cần tìm sự khác biệt giữa hai ngày trong SQL Server, bạn có thể đã sử dụng DATEDIFF()
hàm số. Hàm này trả về khoảng thời gian giữa hai ngày bằng cách sử dụng datepart do bạn chỉ định. Ví dụ:bạn có thể sử dụng nó để trả về số ngày giữa ngày 1 và ngày 2. Bạn cũng có thể sử dụng nó để trả về số phút, giây, tháng, năm, v.v.
DATEDIFF_BIG()
hàm hoạt động theo cùng một cách, nhưng có một điểm khác biệt nhỏ:Kiểu dữ liệu trả về của nó.
Vì vậy, sự khác biệt giữa hai hàm này là kiểu dữ liệu của giá trị trả về của chúng.
-
DATEDIFF()
trả về một số nguyên có dấu ( int ) -
DATEDIFF_BIG()
trả về một số nguyên lớn có dấu ( bigint )
Trong một số trường hợp, bạn sẽ không cần trả lại bigint loại dữ liệu. Điều này đại diện cho một con số rất lớn và bạn có sử dụng DATEDIFF()
hay không hoặc DATEDIFF_BIG()
sẽ không có gì khác biệt (ngoại trừ yêu cầu lưu trữ - int sử dụng 4 byte, bigint sử dụng 8 byte).
Tuy nhiên, nếu bạn gặp phải lỗi sau:
Hàm dateiff dẫn đến lỗi tràn. Số lượng phần ngày tách hai phiên bản ngày / giờ quá lớn. Cố gắng sử dụng dateiff với ngày tháng ít chính xác hơn.
Đó là do giá trị trả về quá lớn.
Trong trường hợp này, bạn cần thực hiện một trong ba điều sau:
- Sử dụng một khoảng thời gian ngắn hơn. Ví dụ:thay vì cố gắng trả về số mili giây trong 26 ngày, hãy thử 25.
- Sử dụng datepart kém chính xác hơn . Ví dụ:thay vì cố gắng trả về số mili giây, hãy thử chỉ bằng giây.
- Sử dụng
DATEDIFF_BIG()
chức năng thay thế.
Đôi khi hai tùy chọn đầu tiên không phù hợp. Nếu bạn cần khoảng thời gian 26 ngày, thì 25 sẽ không cắt giảm được. Và nếu bạn cần dấu thời gian Unix trước năm 2038, bạn sẽ gặp sự cố năm 2038 nếu sử dụng DATEDIFF()
.
Trong mọi trường hợp, DATEDIFF_BIG()
hàm cho phép một phạm vi kết quả lớn hơn nhiều so với DATEDIFF()
.
Ví dụ
Dưới đây là hai ví dụ để chứng minh cả những điểm tương đồng và sự khác biệt giữa DATEDIFF()
và DATEDIFF_BIG()
.
Kết quả tương tự
Dưới đây là một ví dụ trong đó cả hai hàm đều tạo ra cùng một kết quả:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Kết quả:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
Như mong đợi, cả hai hàm đều trả về cùng một kết quả. Điều này là do giá trị trả về đủ nhỏ để cung cấp cho cả bigint và int Loại dữ liệu. Tất cả những gì chúng tôi làm là trả về số mili giây trong 1 giây.
Kết quả khác nhau
Bây giờ, đây là điều sẽ xảy ra nếu chúng ta tăng khung thời gian lên 1000 năm.
Đầu tiên, đây là điều xảy ra khi chúng tôi sử dụng DATEDIFF()
:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
Kết quả:
LỗiError: 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.
Bây giờ, đây là cách thực hiện DATEDIFF_BIG()
xử lý nó:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Kết quả:
DATEDIFF_BIG -------------- 31556908800000
Trả lại số mili giây trong 1000 năm là quá nhiều đối với int , nhưng đó không phải là vấn đề đối với bigint .