Was tun, wenn man den Tag, den Monat und das Jahr fein säuberlich in Einzelteilen zerlegt hat? Schauen wir uns mal verschiedene Methoden an, daraus ein gültiges Datum herzustellen.
Dieser Beitrag zeigte, wie man mit Integer Operationen die Anzahl der Tage eines Monats ermitteln kann. SQL Server MVP Steve Kass hat den folgenden Trick in den englischen Newsgroups gepostet:
In Ergänzung zu diesem Beitrag kann man auch folgende Alternativen zur Bestimmung des Alters einer Person verwenden:
SET NOCOUNT ON
CREATE TABLE #temp_table
(
hm VARCHAR(5)
)
INSERT #temp_table VALUES('8:30')
INSERT #temp_table VALUES('5:01')
INSERT #temp_table VALUES('12:59')
INSERT #temp_table VALUES('7:20')
SET NOCOUNT OFF
SELECT
CONVERT(VARCHAR, SUM(DATEDIFF(ss, '1900-01-01 00:00', CONVERT(DATETIME, hm)))/3600) +
':' +
CONVERT(VARCHAR, (SUM(DATEDIFF(ss, '1900-01-01 00:00', CONVERT(DATETIME, hm)))%3600)/60)
FROM
#temp_table
DROP TABLE #temp_table
-------------------------------------------------------------
33:50
(1 row(s) affected)
DECLARE @time INT
SET @time = 7382
SELECT
@time / 3600 AS Stunden
, (@time / 60)% 60 AS Minuten
, @time % 60 AS Sekunden
Stunden Minuten Sekunden
----------- ----------- -----------
2 3 2
(1 row(s) affected)
SELECT RIGHT(STUFF(CONVERT(CHAR(22),GETDATE(),13),21,4,' '),9)
---------
10:14:40
(1 row(s) affected)
--Oder
SELECT CONVERT(CHAR(8), GETDATE(), 8)
--------
10:14:40
(1 row(s) affected)
--Oder
SELECT CONVERT(CHAR(8), GETDATE(), 108)
--------
10:14:40
(1 row(s) affected)
Falls man auch noch die Millisekunden braucht, kann man:
SELECT CONVERT(CHAR(12),GETDATE(),114)
------------
10:20:16:033
(1 row(s) affected)
ausführen.
USE Northwind
GO
SELECT
n.dow
, ISNULL(SUM(o.Freight),0)
FROM Orders o
RIGHT JOIN
(SELECT 1
dow
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7) n
ON DATEPART(w,Orderdate) = n.dow
GROUP BY n.dow
dow
----------- ---------------------
1 13772.8400
2 12858.7800
3 11069.5500
4 12114.7200
5 15126.8000
6 .0000
7 .0000
(7 row(s) affected)
Warnung: NULL-Wert wird durch eine Aggregat- oder eine andere SET-Operation gelöscht.
Danke an Jonathan Van Houtte.
Die anderen 4 Byte speichern die Tageszeit, die als Anzahl der Millisekunden seit Mitternacht dargestellt wird.
Dies kann man in der Januar 2004 Edition von BOL nachlesen.