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 DATEADDDATEDIFFtrong 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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.