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:
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.
Es gibt anscheinend unterschiedliche Meinungen über die Berechnung des Median. Zum einen gibt es den 'financial' Median, der das arithmetische Mittel der beiden mittleren Werte ist, zum anderen den 'statistischen' Median, der der niedrigere (bzw. bei Gleichheit der Werte) der erste der Werte ist. In Büchern über T-SQL findet man die komplexesten Statements zur Berechnung des Median, dabei ist dieser sehr einfach mit Hilfe von TOP n PERCENT zu berechnen. Hier ist ein Beispiel zur Berechnung des 'financial' Medians:
DECLARE @stmt nvarchar(4000)
DECLARE @rowcount bigint
DECLARE @table nvarchar(255)
SET @table = 'authors'
SELECT @stmt = 'SELECT @count = COUNT(*) FROM ' + @table
EXEC sp_executesql @stmt, N' @count bigint output', @rowcount OUTPUT
IF @rowcount > 0
BEGIN
SELECT @rowcount AS Anzahl
END
RETURN
Anzahl
--------------------
23
(1 row(s) affected)
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)