Monatsultimo ermitteln

By Frank Kalis

Posted on Jul 13, 2004 von in SQL Server

Die Ermittlung bestimmter Tage taucht in dieser oder jener Form immer mal wieder auf. T-SQL bietet hierfür sehr wirkungsvolle Methoden an:

SELECT 
DATEADD(DAY, -DAY(GETDATE()), CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME))
AS Monatsultimo

Monatsultimo
------------------------------------------------------
2004-05-31 00:00:00.000

(1 row(s) affected)

Eine weitere Alternative, die auf schnelle und effiziente Integer Operationen zurückgreift, ist folgende:

SELECT DATEADD(d,DATEDIFF(d,DAY(GETDATE()),GETDATE()),0) AS Monatsultimo

Monatsultimo
------------------------------------------------------
2004-07-31 00:00:00.000

(1 row(s) affected)

Danke an Jonathan van Houtte für die zweite Alternative.

SQL Server MVP Steve Kass hat folgendes Skript gepostet:

declare @31st datetime
set @31st = '19341031' -- any 31st

declare @now datetime
set @now = getdate()

select dateadd(month,datediff(month,@31st,@now),@31st)

------------------------------------------------------
2004-08-31 00:00:00.000

(1 row(s) affected)

Das Interessante an Steve's Skript ist, daß jeder beliebige Monatsultimo, egal ob vergangen oder noch zukünftig, funktioniert. So kann man z.B.

declare @31st datetime
set @31st = '20051031' -- any 31st

declare @now datetime
set @now = getdate()

select dateadd(month,datediff(month,@31st,@now),@31st)

------------------------------------------------------
2004-08-31 00:00:00.000

(1 row(s) affected)

ausführen, und erhält dennoch den gewünschten Ultimo. Eine Einschränkung hingegen existiert dennoch. Der Monatsultimo muß zwingend der eines Monats mit 31 Tagen sein. Angaben wie der 28. oder 29. Februar (z.B.: 20050228 oder 20050229) oder der 30. April (z.B.: 20050430) führen nicht zur Ermittlung des korrekten Ultimos.

Anmerkung: 02.06.2005: Folgendes geht auch:

SELECT 
DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),30)
Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: , , ,

Noch kein Feedback


Formular wird geladen...