Dies sammelt auch einige Jahre später häufig zusätzliche Stimmen, und deshalb muss ich es für moderne Versionen von SQL Server aktualisieren. Für SQL Server 2008 und höher ist es einfach:
cast(getDate() As Date)
Beachten Sie, dass die letzten drei Absätze im unteren Bereich weiterhin gelten und Sie häufig einen Schritt zurücktreten müssen, um die Besetzung überhaupt zu vermeiden.
Es gibt aber auch andere Möglichkeiten, dies zu erreichen. Hier sind die häufigsten.
Der richtige Weg (neu seit SQL Server 2008):
cast(getdate() As Date)
Der richtige Weg (alt):
dateadd(dd, datediff(dd,0, getDate()), 0)
Dies ist jetzt älter, aber es ist immer noch wissenswert, da es sich auch leicht an andere Zeitpunkte anpassen lässt, wie den ersten Moment des Monats, der Minute, der Stunde oder des Jahres.
Auf diese korrekte Weise werden dokumentierte Funktionen verwendet, die Teil des Ansi-Standards sind und garantiert funktionieren, aber etwas langsamer sein können. Es funktioniert, indem ermittelt wird, wie viele Tage von Tag 0 bis zum aktuellen Tag vorhanden sind, und so viele Tage zurück zu Tag 0 hinzugefügt werden. Dies funktioniert unabhängig davon, wie Ihre Datums- und Uhrzeitangabe gespeichert ist und welches Gebietsschema Sie haben.
Der schnelle Weg:
cast(floor(cast(getdate() as float)) as datetime)
Dies funktioniert, weil datetime-Spalten als 8-Byte-Binärwerte gespeichert werden. Wirf sie in Float um, lege sie auf den Boden, um den Bruch zu entfernen, und der Zeitanteil der Werte ist weg, wenn du sie auf datetime zurückwirfst. Es ist alles nur ein bisschen verschoben ohne komplizierte Logik und es ist sehr schnell.
Beachten Sie, dass dies von einem Implementierungsdetail abhängt, das Microsoft jederzeit ändern kann, selbst bei einem automatischen Service-Update. Es ist auch nicht sehr tragbar. In der Praxis ist es sehr unwahrscheinlich, dass sich diese Implementierung bald ändert. Es ist jedoch wichtig, sich der Gefahr bewusst zu sein, wenn Sie sie verwenden. Und jetzt, da wir die Möglichkeit haben, als Datum zu besetzen, ist dies selten notwendig.
Der falsche Weg:
cast(convert(char(11), getdate(), 113) as datetime)
Der falsche Weg funktioniert durch Konvertieren in eine Zeichenfolge, Abschneiden der Zeichenfolge und Zurückkonvertieren in eine Datums- / Uhrzeitangabe. Es ist aus zwei Gründen falsch : 1) es funktioniert möglicherweise nicht in allen Regionen und 2) es geht um den langsamsten Weg, dies zu tun ... und nicht nur ein wenig; Es ist wie eine Größenordnung oder zwei langsamer als die anderen Optionen.
Update Dies hat in letzter Zeit einige Stimmen erhalten, und deshalb möchte ich hinzufügen, dass ich seit dem Posten einige ziemlich solide Beweise dafür gesehen habe, dass SQL Server den Leistungsunterschied zwischen "korrektem" und "schnellem" Weg optimieren wird Das heißt, Sie sollten jetzt die erstere bevorzugen.
In beiden Fällen möchten Sie Ihre Abfragen schreiben, um zu vermeiden, dass dies überhaupt erforderlich ist . Es ist sehr selten, dass Sie diese Arbeit an der Datenbank ausführen sollten.
In den meisten Fällen ist die Datenbank bereits Ihr Engpass. Es ist im Allgemeinen der Server, auf dem das Hinzufügen von Hardware für Leistungsverbesserungen am teuersten ist und auf dem es am schwierigsten ist, diese Ergänzungen richtig zu machen (Sie müssen beispielsweise die Festplatten mit dem Speicher in Einklang bringen). Es ist auch am schwierigsten, sowohl technisch als auch geschäftlich nach außen zu skalieren. Es ist technisch viel einfacher, einen Web- oder Anwendungsserver als einen Datenbankserver hinzuzufügen, und selbst wenn dies falsch wäre, zahlen Sie nicht mehr als 20.000 USD pro Serverlizenz für IIS oder Apache.
Der Punkt, den ich versuche, ist, dass Sie diese Arbeit, wann immer möglich, auf Anwendungsebene ausführen sollten. Das einzige Mal, dass Sie jemals feststellen sollten, dass Sie eine Datums- / Uhrzeitangabe auf SQL Server abschneiden, ist, wenn Sie nach Tag gruppieren müssen, und selbst dann sollten Sie wahrscheinlich eine zusätzliche Spalte als berechnete Spalte einrichten, die zum Zeitpunkt des Einfügens / Aktualisierens verwaltet oder verwaltet wird in der Anwendungslogik. Holen Sie sich diese indexbrechende, CPU-schwere Arbeit aus Ihrer Datenbank.