By Frank Kalis
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)