Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhalte ich das erste und letzte Datum des laufenden Jahres?

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