PDA

Vollständige Version anzeigen : Ein paar hilfreiche Datumsfunktionen


strausto
24.05.2006, 23:15
DECLARE @DATUM DATETIME
SET @DATUM = GETDATE()

-- Datum ohne Uhrzeit
SELECT
CAST(SUBSTRING(CAST(@DATUM AS BINARY(8)),1,4) + 0x00000000
AS DATETIME)
-- Ergenis: 2006-05-24 00:00:00.000

-- Der Erste des Monats 'ohne' Urzeit (abgebildet wird Mitternacht)
SELECT
CAST(SUBSTRING(CAST((DATEADD(d,-DAY(@DATUM),@DATUM) + 1)
AS BINARY(8)),1,4) + 0x00000000 AS DATETIME)
-- Ergebnis: 2006-05-01 00:00:00.000

-- Der letzte des Monats 'ohne' Urzeit (abgebildet wird Mitternacht)
SELECT
CAST(SUBSTRING(CAST((DATEADD(m,1,@DATUM)-DAY(@DATUM))
AS BINARY(8)),1,4) + 0x00000000 AS DATETIME)
-- Ergebnis: 2006-05-31 00:00:00.000

-- Der erste des Jahres um Mitternacht
SELECT CONVERT(DATETIME,(STR(YEAR(@DATUM)*10000 + 101)),104)
-- Ergebnis: 2006-01-01 00:00:00.000

-- Der letzte des Jahres um Mitternacht
SELECT CONVERT(DATETIME,(STR(YEAR(@DATUM)*10000 + 1231)),104)
-- Ergebnis: 2006-12-31 00:00:00.000

-- Erster Tag des Quartals
SELECT
CAST(SUBSTRING(CAST((dateadd(q,((datepart(q,getdate()))-1),(dateadd(y,-
(datepart(y,getdate()))+1,getdate()))-0)) AS BINARY(8)),1,4) + 0x00000000 AS DATETIME)
-- Ergebnis: 2007-07-01 00:00:00.000

-- Letzter Tag des Quartals
SELECT
CAST(SUBSTRING(CAST((dateadd(q,((datepart(q,getdate()))),(dateadd(y,-
(datepart(y,getdate()))+1,getdate()))-1)) AS BINARY(8)),1,4) + 0x00000000 AS DATETIME)
-- Ergebnis: 2007-09-30 00:00.000

-- Extrahieren der Uhrzeit
SELECT CONVERT(CHAR(12),(@DATUM),114)
-- Ergebnis: 22:52:22:273
SELECT CONVERT(CHAR(12),(@DATUM),108)
-- Ergebnis: 22:53:06

-- Extrahieren des Wochentages
Select Datename(w,@DATUM)
-- Ergebnis: Wednesday

Und an dieser Stelle noch zwei Methoden von Hugo Kornelis

-- Letzter Tag des Vormonats ohne Uhrzeit
SELECT
DATEADD(month, DATEDIFF(month, '20000101', @DATUM), '19991231')
-- Ergebnis: 2006-04-30 00:00:00.000

Auflösung:


-- Ermitteln der Tagesdifferenz zwischen Heute und einem beliebigen Datums
SELECT DATEDIFF(DAY,'20000101',@DATUM)
-- Ergebnis: 2335


-- Addidition dieser Tage zum beliebigen Datum
SELECT DATEADD(day,2335,'20000101')
-- Ergebnis: 2006-05-24 00:00:00.000

bzw:

-- Addidition dieser Tage zum beliebigen Datum
SELECT DATEADD(day,DATEDIFF(DAY,'20000101',@DATUM),'20000101')
-- Ergebnis: 2006-05-24 00:00:00.000



-- Letzter Tag des Monats ohne Uhrzeit
SELECT
DATEADD(month, DATEDIFF(month, '20000101', @DATUM), '20000131')
-- Ergebnis: 2006-05-31 00:00:00.000


USE tempdb
IF OBJECT_ID('fn_DateWithoutTime') IS NOT NULL DROP FUNCTION fn_DateWithoutTime
GO

-- Function für die Darstellung eines Datums ohne Uhrzeit
CREATE FUNCTION fn_DateWithoutTime (@Date datetime)
RETURNS SMALLDATETIME

AS

BEGIN

RETURN CAST(SUBSTRING(CAST(@Date AS BINARY(8)),1,4)
+ 0x00000000 AS DATETIME)

END

GO

SELECT fn_DateWithoutTime(GETDATE())
-- Ergebnis: 2006-05-24 00:00:00


-- An welchen Tagen im Q2 wurde kein Eintrag generiert (exemplarisch!)

USE TEMPDB
GO
IF OBJECT_ID('TEST') IS NOT NULL DROP TABLE TEST
GO

SELECT

DATUM = '2006-01-01',
WERT = 1

INTO

TEST

INSERT TEST VALUES('2006-02-03', 10)
INSERT TEST VALUES('2006-03-10', 100)
INSERT TEST VALUES('2006-04-05', 5)
INSERT TEST VALUES('2006-07-21', 24)


DECLARE @TABLE TABLE
(
DATUM SMALLDATETIME
)

DECLARE @DATUM SMALLDATETIME
DECLARE @I INT

SELECT @DATUM = CONVERT(DATETIME,(STR(YEAR(GETDATE())*10000 + 101)),104)
SELECT @I =DATEDIFF(D,@DATUM,DATEADD(YY,1,@DATUM))

WHILE @I > 0
BEGIN
INSERT @TABLE VALUES (DATEADD(DAY,@I -1,@DATUM))
SET @I = @I -1
END

SELECT * FROM @TABLE T LEFT JOIN TEST ON TEST.DATUM = T.DATUM
WHERE
DATEPART(Q,T.DATUM) = 2
AND WERT IS NULL