SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Truy vấn trên cung cấp giá trị ngày giờ cho nửa đêm đầu ngày 31 tháng 12. Đây là khoảng thời gian ngắn hơn 24 giờ so với thời điểm cuối cùng trong năm. Nếu bạn muốn bao gồm thời gian có thể xảy ra vào ngày 31 tháng 12, thì bạn nên so sánh với ngày đầu tiên của năm tiếp theo, với <
sự so sánh. Hoặc bạn có thể so sánh với vài mili giây cuối cùng của năm hiện tại, nhưng điều này vẫn để lại khoảng cách nếu bạn đang sử dụng thứ gì đó không phải DATETIME (chẳng hạn như DATETIME2):
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
Các khoảng thời gian khác
Cách tiếp cận này có hai khía cạnh tốt:hiệu suất tốt và nó có thể dễ dàng thay đổi cho các khoảng thời gian khác bằng cách thay thế cả hai lần xuất hiện của yy
(=year) với một chuỗi khác:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Hãy cẩn thận với các tuần:ngày bắt đầu phụ thuộc vào cài đặt máy chủ.)
Chi tiết kỹ thuật
Điều này hoạt động bằng cách tìm ra số năm kể từ năm 1900 với DATEDIFF(yy, 0, GETDATE())
và sau đó thêm ngày đó vào ngày không =ngày 1 tháng 1 năm 1900. Có thể thay đổi điều này để hoạt động cho một ngày tùy ý bằng cách thay thế GETDATE()
một phần hoặc một năm tùy ý bằng cách thay thế DATEDIFF(...)
chức năng với "Năm - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015