Der DATETIME Datentyp ist 8 Bytes gross. Die ersten vier Bytes speichern die Anzahl der Tage vor oder nach dem 01.01.1900; die letzten vier Bytes speichern die Anzahl der 'Clock Ticks' seit Mitternacht. Die binäre Darstellung jedes der beiden 4-byte Stücke ist tatsächlich die gleiche die auch für Integer Darstellung benutzt wird. Jede Sekunde besteht aus 300 Ticks, die merkwürdigerweise um ein Vielfaches präziser sind als @@TIMETICKS.
DECLARE @yr INT
DECLARE @jd INT
SELECT @yr = 2002, @jd = 245
SELECT DATEADD(yyyy, @yr - 1900, -1) + @jd AS Julian_Date
Julian_Date
------------------------------------------------------
2002-09-02 00:00:00.000
(1 row(s) affected)
Danke an Jonathan Van Houtte.
DECLARE @sekunden INT
SET @sekunden = 61
SELECT
CONVERT(VARCHAR(2), FLOOR(@sekunden/60)) +
':' +
RIGHT('0' + CONVERT(VARCHAR(2), (@sekunden%60)), 2)
-----
1:01
(1 row(s) affected)
SELECT DATEADD(day, 0 , DATEDIFF(day, 0, MsgDateReceived)) AS "Datum" , COUNT(*) AS Anzahl FROM mails_header GROUP BY DATEADD(day, 0 , DATEDIFF(day, 0, MsgDateReceived)) ORDER BY "Datum" DESC
SELECT YEAR(GETDATE())*1000 + DATEPART(y,GETDATE()) AS the_date the_date ----------- 2004182 (1 row(s) affected)
Danke an Jonathan van Houtte!
DECLARE @d DATETIME SET @d = '23.07.1968' SELECT DATEDIFF(yyyy,CAST(@d AS DATETIME),GETDATE()) - (CASE WHEN DATEADD(yyyy,DATEDIFF(yyyy,CAST(@d AS DATETIME),GETDATE()),CAST(@d AS DATETIME)) > GETDATE() THEN 1 ELSE 0 END) ----------- 35 (1 row(s) affected)
Eigentlich würde man so eine Aufgabe wahrscheinlich besser im Client code verarbeiten, aber wenn's denn unbedingt der Server sein soll, könnte dies folgendermaßen aussehen:
DECLARE @date DATETIME
SET @date = '19.10.2003 09:48:22'
SELECT
CAST(
CONVERT(CHAR(4), YEAR(@date)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, MONTH(@date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DAY(@date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DATEPART(hour, @date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DATEPART(minute,@date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DATEPART(second,@date)), 2))
AS CHAR(14))
/*oder*/
SELECT
SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(CHAR,@date,120),'-',''),' ',''),':',''),1,14)
--------------
20031019094822
(1 row(s) affected)
--------------
20031019094822
(1 row(s) affected)
Nachtrag 20.09.2004: Offentsichtlich geht es auch noch eine Spur einfacher:
DECLARE @date DATETIME
SET @date = '19.10.2003 09:48:22'
SELECT
REPLACE(REPLACE(REPLACE(CONVERT(CHAR,@date,120),'-',''),' ',''),':','')
-------------------
20031019094822
(1 row(s) affected)
Die Ermittlung bestimmter Tage taucht in dieser oder jener Form immer mal wieder auf. T-SQL bietet hierfür sehr wirkungsvolle Methoden an: