Toán học ngày hoạt động như thế nào trong SQL Server?


7

Tôi thường thấy các truy vấn được viết cùng DATEADDvà DATEDIFFtrong WHEREmệnh đề để xác định một phạm vi, làm phẳng thời gian đến 0 giờ hoặc tìm ngày cuối cùng của tháng hoặc năm, nhưng tôi không hiểu tất cả các phần hoạt động như thế nào.

Ví dụ: điều này sẽ tìm thấy ngày bắt đầu từ ngày hiện tại, đến ngày bắt đầu của ngày 30 ngày trước.

SELECT *
FROM tbl
WHERE datecol >= DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)
AND datecol   <  DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);

Tất cả các phần khác nhau của thành tựu này là gì?

Câu trả lời:


11

Cách tốt nhất để hiểu cách toán ngày hoạt động là chia một truy vấn thành các phần của nó.

Bắt đầu với điều này:

SELECT GETUTCDATE() AS utc_date

Vào ngày đặc biệt này, nó trở lại 2017-10-04 19:34:20.050.

Trong toán ngày, số 0 và ngày 1900-01-01 có thể hoán đổi cho nhau.

   SELECT DATEDIFF(DAY, 0, GETUTCDATE()) AS [what does zero mean?],
          DATEDIFF(DAY, '19000101', GETUTCDATE()) AS [it means 1900-01-01]

Điều đó có nghĩa là bạn có thể chuyển đổi gần như bất kỳ số nào thành một ngày. Ngay cả số âm.

   SELECT CONVERT(DATETIME, -1) AS [how is -1 a date?]

Điều này sẽ mang lại 1899-12-31 00:00:00.000, đó là điều tương tự như thế này:

SELECT DATEADD(DAY, -1, '19000101') AS [zero minus 1 days]

Chỉ cần trừ một ngày từ 1900-01-01. Lạ nhỉ?

Điều này giúp chúng ta như thế nào?

Hãy xem xét bên trong truy vấn ban đầu của chúng tôi:

SELECT DATEDIFF(DAY, 0, GETUTCDATE())

Điều đó cho chúng tôi số ngày giữa 1900-01-01và ngày hiện tại. Có nghĩa là biểu thức đầy đủ:

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)

Là việc thêm số ngày giữa 1900-01-01và hiện tại 1900-01-01. Điều đó cho chúng ta sự khởi đầu của ngày hiện tại, lúc 0 giờ.

Phần thứ hai thực hiện điều tương tự, ngoại trừ trừ 30 ngày kể từ 1900-01-010 giờ.

DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);

Nếu điều này là quá nhiều để nhớ, tôi hoàn toàn hiểu.

Để biết thông tin về các tính toán ngày quan trọng, hãy xem bài viết của Tim Ford .

Đối với một bảng lịch của những ngày quan trọng, xem bài viết của Aaron Bertrand .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.