SELECT
CONVERT(CHAR(6),DATEADD(MONTH, 1, GETDATE()),112)
+
'01' AS 'firstDayofNextMonth'
, CONVERT(CHAR(8),DATEADD(day, -1, CONVERT(CHAR(6),DATEADD(MONTH, 2, GETDATE()),112)
+
'01'),112) AS 'lastDayofNextMonth'
firstDayofNextMonth lastDayofNextMonth
------------------- ------------------
20040701 20040731
(1 row(s) affected)
Ergänzung 17.11.2004: Das Ganze kann aber auch folgendermaßen ausgedrückt werden:
SELECT
DATEADD(MONTH,DATEDIFF(MONTH,30,GETDATE()),30)+1
, DATEADD(MONTH,DATEDIFF(MONTH,30,GETDATE())+1,30)
------------------------- ------------------------
2004-12-01 00:00:00.000 2004-12-31 00:00:00.000
(1 row(s) affected)
GETDATE() ist nichtdeterministisch. Eine deterministische Funktion liefert ceteris paribus immer das gleiche Ergebnis. Da GETDATE() keine Argumente entgegennimmt und stets unterschiedliche Werte zurückgibt, ist die Funktion nicht deterministisch. Dies ist auch der Grund, warum man GETDATE() nicht als DEFAULT innerhalb der Funktion definieren kann. Nur deterministische Funktionen können, wie in BOL beschrieben, in UDF's verwendet werden.
Man kann das aber umgehen, indem man einen VIEW erzeugt, der GETDATE() zurückgibt und dann diesen VIEW in der UDF referenziert.
Direktes Updaten der Systemtabellen ist eine der schnellsten Methoden, um SQL Server in die Irre zu führen. Daher sollte dies nur im Notfall angewendet werden: