SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Горната заявка дава стойност за дата и час за полунощ в началото на 31 декември. Това е на около 24 часа от последния момент от годината. Ако искате да включите времето, което може да настъпи на 31 декември, тогава трябва да сравните с първото число на следващата година с <
сравнение. Или можете да сравните с последните няколко милисекунди на текущата година, но това все още оставя празнина, ако използвате нещо различно от DATETIME (като 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
Други периоди
Този подход има два хубави аспекта:добра производителност и може лесно да бъде променен за други периоди, като се заменят и двете поява на yy
(=година) с различен низ:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Внимавайте със седмиците:началният ден зависи от настройките на сървъра.)
Технически подробности
Това работи, като се изчисли броят на годините от 1900 г. с DATEDIFF(yy, 0, GETDATE())
и след това добавяне към дата от нула =1 януари 1900 г. Това може да се промени, за да работи за произволна дата, като замените GETDATE()
част или произволна година, като замените DATEDIFF(...)
функция с "Година - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015