MS SQL Server Datetime mal ganz zeitlos

Nach mehreren anderen Varianten habe ich heute endlich die vermutlich performanteste Routine zum Entfernen des Uhrzeit-Anteils aus einem MS SQL Server Datetime Ausdruck gefunden:

    select DATEADD(dd,0,datediff(dd,0,GETDATE()))

Der Trick dabei ist, dass SQL Server die Zahl 0 als ein fixes Bezugsdatum interpretiert. Das Beispielstatement

    select DATEADD(dd,0,0)

zeigt uns das interne Tag Null Referenzdatum 1. Januar 1900.

Die Datediff-Differenz zwischen diesem und dem aktuellen Datum sagt uns wieviele Tage seit dem 1. Januar 1990 vergangen sind. Addiert auf das Bezugsdatum 0 ergibt sich somit wieder das heutige Datum — nur halt ohne Zeit.

Da nur Integer-Operationen genutzt werden statt komplexerer Umwandlungen ist diese Routine viel schneller als String-Format-Umwandlungen wie beispielsweise

    select convert(datetime,convert(varchar(8),GETDATE(),112))

Es bietet sich an unsere Rechenroutine als Funktion anzulegen:

    CREATE function [dbo].[getDateWithoutTime] (@mydate datetime)
    returns datetime
    as
    begin
        return DATEADD(dd,0,datediff(dd,0,@mydate))
    end