DECLARE @dt DATETIME
SET @dt = GETDATE()
SELECT
CAST(CAST(YEAR(@dt) AS CHAR(4))+'0101' AS DATETIME)
AS Jahresanfang
, CAST(CAST(YEAR(@dt) AS CHAR(4))+'-12-31T23:59:59.997' AS DATETIME)
AS Jahresende
Jahresanfang Jahresende
------------------------------------------------------ ------------------------
2004-01-01 00:00:00.000 2004-12-31 23:59:59.997
(1 row(s) affected)
DECLARE @d DATETIME
SET @d = '31/01/2003 12:00:00'
SELECT
DAY(DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DAY(@d),@d)))) AS TageImMonat
TageImMonat
-----------
31
(1 row(s) affected)
Bei der Wahl des Datumsformat muss man vorsichtig sein. So funktionieren zum Beispiel:
SET @d = '20030131 12:00:00'
und
SET @d = '31.01.2003 12:00:00'
während
SET @d = '2003-01-31 12:00:00'
Server: Nachr.-Nr. 242, Schweregrad 16, Status 3, Zeile 2
Bei der Konvertierung ... char-Datentyps in ... datetime-Datentyp ... außerhalb des gültigen Bereichs.
hervorruft.
Select
Cast(-53690 As DateTime) As 'Erstes Datum'
, Cast(2958463.999999999 As DateTime) As 'Letztes Datum'
Erstes Datum Letztes Datum
------------------------- -------------------------
1753-01-01 00:00:00.000 9999-12-31 23:59:59.997
(1 row(s) affected)
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)
Der Datetime Datentyp, so wie er im SQL Server 2000 und früher implementiert ist, enthält immer einen Zeitpart. Somit ist der Titel dieses Beitrages evtl. etwas irreführend. Dieser Zeitanteil kann jedoch auf Mitternacht gesetzt werden, somit faktisch = 0, und wirkt sich damit nicht weiter störend aus.
Hier sind einige Beispiel, wie dies erreicht werden kann:
USE pubs
GO
SELECT
DATEDIFF(DAY, pubdate, GETDATE()) AS Anzahl_Tage
FROM
titles
GO
Anzahl_Tage
-----------
4761
4764
4743
4751
4764
4755
1418
4743
3665
1418
4630
4758
4646
4761
4761
4630
4761
4761
(18 row(s) affected)
SELECT
DATEPART(yy , GETDATE()) AS Jahr
, DATEPART(qq , GETDATE()) AS Quartal
, DATEPART(mm , GETDATE()) AS Monat
, DATEPART(dd , GETDATE()) AS Tag
, DATEPART(hh , GETDATE()) AS Stunden
, DATEPART(mi , GETDATE()) AS Minuten
, DATEPART(ss , GETDATE()) AS Sekunden
, DATEPART(ms , GETDATE()) AS Millisekunden
, DATEPART(wk , GETDATE()) AS Woche
Jahr Quartal Monat Tag Stunden Minuten Sekunden Millisekunden Woche
--------- --------- --------- --------- --------- --------- --------- ------------- -----
2004 2 6 23 11 23 59 513 26
(1 row(s) affected)
Weitere Informationen stehen in BOL.