SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Výše uvedený dotaz poskytuje hodnotu datetime pro půlnoc na začátku 31. prosince. To je asi 24 hodin do posledního okamžiku roku. Pokud chcete zahrnout čas, který by mohl nastat 31. prosince, měli byste porovnat s prvním v příštím roce pomocí <
srovnání. Nebo můžete porovnat s několika posledními milisekundami aktuálního roku, ale stále ponechává mezeru, pokud používáte něco jiného než DATETIME (například 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
Další období
Tento přístup má dva pěkné aspekty:dobrý výkon a lze jej snadno změnit na jiná období nahrazením obou výskytů yy
(=rok) s jiným řetězcem:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Pozor na týdny:počáteční den závisí na nastavení serveru.)
Technické podrobnosti
Funguje to tak, že se zjistí počet let od roku 1900 pomocí DATEDIFF(yy, 0, GETDATE())
a poté to přičteme k datu nula =1. ledna 1900. Toto lze změnit tak, aby fungovalo pro libovolné datum nahrazením GETDATE()
část nebo libovolný rok nahrazením DATEDIFF(...)
funkce s "Rok - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015