SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
Die obige Abfrage ergibt einen datetime-Wert für Mitternacht am Anfang des 31. Dezember. Dies ist etwa 24 Stunden vor dem letzten Moment des Jahres. Wenn Sie Zeiten einbeziehen möchten, die am 31. Dezember liegen könnten, dann sollten Sie mit einem <
mit dem ersten des nächsten Jahres vergleichen Vergleich. Oder Sie können mit den letzten paar Millisekunden des aktuellen Jahres vergleichen, aber dies hinterlässt immer noch eine Lücke, wenn Sie etwas anderes als DATETIME verwenden (z. B. 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
Andere Zeiträume
Dieser Ansatz hat zwei nette Aspekte:gute Leistung und er kann leicht für andere Perioden geändert werden, indem beide Vorkommen von yy
ersetzt werden (=Jahr) mit einem anderen String:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Achten Sie auf Wochen:der Starttag hängt von den Servereinstellungen ab.)
Technische Details
Dies funktioniert, indem die Anzahl der Jahre seit 1900 mit DATEDIFF(yy, 0, GETDATE())
ermittelt wird und das dann zu einem Datum von Null =1. Januar 1900 hinzufügen. Dies kann geändert werden, um für ein beliebiges Datum zu funktionieren, indem GETDATE()
ersetzt wird Teil oder ein beliebiges Jahr durch Ersetzen des DATEDIFF(...)
Funktion mit "Jahr - 1900."
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015