Zeit aus einer DATETIME Spalte entfernen

By Frank Kalis

Posted on Jul 12, 2004 von in SQL Server

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:

SELECT DATEADD(d,DATEDIFF(d,0,getdate()),0)
SELECT CAST(SUBSTRING(CAST(GETDATE() AS BINARY(8)),1,4) + 0x00000000 AS DATETIME)
SELECT CAST(CAST(SUBSTRING(CAST(GETDATE() AS BINARY(8)),1,4) AS INT) AS DATETIME)
SELECT CONVERT(DATETIME,CONVERT(CHAR(8),GETDATE(),112))

SELECT CONVERT(CHAR(8),GETDATE(),112)
SELECT CAST(CAST(GETDATE() AS VARCHAR(12)) AS DATETIME)
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

Ich selber bevorzuge die erste Alternative, da sie für mich intuitiver und flexibler ist und immer noch eine sehr gute Gesamtperformance bringt. Die 2) und 3) der aufgeführten Techniken sind weniger gebräuchlich, bieten aber exzellente Performance, während die restlichen eher aus Vollständigkeitsgründen aufgelistet werden. Zumal CONVERT einen Read auf die syslanguages Tabelle ausführen muss (siehe unten). 

Anmerkung 10.05.2004:
Nach Diskussion mit SQL Server MVP Tibor Karaszi möchte ich folgende Zusätze machen:
1) Anstelle von GETDATE() kann ebenfalls CURRENT_TIMESTAMP verwendet werden. Dadurch erreicht man eine höhere ANSI SQL Kompatibilität bei manchen Methoden (namentlich 5. und 6.), die zwar nicht zu den schnellsten gehören, aber portabel sind.
2) Der Read auf die syslanguages Tabelle kann nicht eindeutig nachvollzogen werden. Mittlerweile sind wir beide eher der Auffassung, dass SQL Server hierfür eine interne Struktur verwendet.

Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: , ,

Noch kein Feedback


Formular wird geladen...