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-01
và 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-01
và 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-01
0 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 .