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.
cast(getdate() as date)
?getdate()
Hier finden Sie einen Ersatz für jede Datums- / Uhrzeitquelle, die Sie möglicherweise haben.Nur für SQL Server 2008
Wenn Sie möchten, setzen Sie es dann auf datetime zurück
quelle
Nur um eine vollständigere Antwort zu erhalten, finden Sie hier eine Arbeitsweise zum Abschneiden auf Datumsangaben nach unten und einschließlich Minuten (durch
GETDATE()
das zu kürzende Datum ersetzen ).Dies unterscheidet sich von der akzeptierten Antwort darin, dass Sie nicht nur
dd
(Tage), sondern alle Datumsangaben verwenden können (siehe hier ):Beachten Sie, dass im obigen Ausdruck das
0
ein konstantes Datum am Anfang eines Jahres ist (1900-01-01). Wenn Sie auf kleinere Teile zuschneiden müssen, z. B. auf Sekunden oder Millisekunden, müssen Sie ein konstantes Datum verwenden, das näher am zu schneidenden Datum liegt, um einen Überlauf zu vermeiden.quelle
dateadd(minute, datediff(minute, 0, GETDATE()) / 15 * 15, 0)
Das Snippet, das ich im Web gefunden habe, als ich das tun musste, war:
quelle
DateAdd(dd, DateDiff(...), 0)
. Dies kann Sie beißen, wenn Sie nicht vorsichtig sind.In SQl 2005 könnte Ihre Funktion trunc_date so geschrieben werden.
(1)
Die erste Methode ist viel sauberer. Es werden nur 3 Methodenaufrufe verwendet, einschließlich des endgültigen CAST (), und es wird keine Zeichenfolgenverkettung durchgeführt, was ein automatisches Plus ist. Darüber hinaus gibt es hier keine großen Typabgüsse. Wenn Sie sich vorstellen können, dass Datums- / Zeitstempel dargestellt werden können, ist die Konvertierung von Datumsangaben in Zahlen und zurück in Datumsangaben ein ziemlich einfacher Vorgang.
(2)
Wenn Sie sich Sorgen über die Implementierung der Datumsangaben durch Microsoft machen, sind (2) oder (3) möglicherweise in Ordnung.
(3)
Drittens die ausführlichere Methode. Dazu müssen Sie das Datum in seine Teile für Jahr, Monat und Tag aufteilen, diese im Format "JJJJ / MM / TT" zusammenstellen und dann auf ein Datum zurücksetzen. Diese Methode umfasst 7 Methodenaufrufe, einschließlich des endgültigen CAST (), ganz zu schweigen von der Verkettung von Zeichenfolgen.
quelle
quelle
Wählen Sie cast (floor (cast (getdate () als float)) als datetime). Verweisen Sie darauf: http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html
quelle
Für diejenigen unter Ihnen, die hierher gekommen sind, um ein DATETIME-Feld auf weniger als einen ganzen Tag zu kürzen, beispielsweise jede Minute, können Sie Folgendes verwenden:
Wenn also heute
2010-11-26 14:54:43.123
wäre, würde dies zurückkehren2010-11-26 14:54:00.000
.Ersetzen Sie 1440.0 durch die Anzahl der Intervalle pro Tag, um das Intervall zu ändern, in dem es ausgeführt wird. Beispiel:
(Setzen Sie immer ein
.0
am Ende, um implizit auf einen Schwimmer zu werfen.)Für diejenigen unter Ihnen, die sich fragen, wozu das
(3.0/86400000)
in meiner Berechnung gut ist, scheint SQL Server 2005 nichtFLOAT
zuDATETIME
genau zu wirken, daher werden 3 Millisekunden hinzugefügt, bevor der Bodenbelag erstellt wird.quelle
datetime2
Datentyp.Diese Abfrage sollte ein Ergebnis liefern, das dem
trunc(sysdate)
von Oracle entspricht.Hoffe das hilft!
quelle
Sie können das Datum auch
using Substring
aus der Variablen datetime extrahieren. Wenn Sie auf datetime zurücksetzen, wird der Zeitteil ignoriert.Sie können auch auf Teile der datetime-Variablen zugreifen und diese zu einem abgeschnittenen Konstruktdatum zusammenführen.
quelle
Orakel:
SQL Server:
Könnte auch zum Abschneiden von Minuten oder Stunden von einem Datum verwendet werden.
quelle
Sie können dies einfach tun (SQL 2008):
2009-05-28
quelle
TRUNC (aDate, 'DD') schneidet die Minuten, Sekunden und Stunden ab
SRC: http://www.techonthenet.com/oracle/functions/trunc_date.php
quelle