Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

DATEDIFF () so với DATEDIFF_BIG () trong SQL Server:Sự khác biệt là gì?

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()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 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ỗi
Error: 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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tính tuổi (theo năm) dựa trên Ngày sinh và getDate ()

  2. Cách xóa các ký tự đứng đầu và theo sau trong SQL Server

  3. Gửi email có tệp đính kèm trong SQL Server (T-SQL)

  4. Lỗi MSSQL 'Nhà cung cấp cơ bản không thành công khi Mở'

  5. Cài đặt Tiện ích mở rộng tác nhân SQL Server trên Azure Data Studio