Streng genommen, Methode a
ist am wenigsten ressourcenintensiv:
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Nachweislich weniger CPU-intensiv für die gleiche Gesamtdauer eine Million Zeilen von jemandem mit viel zu viel Zeit auf ihre Hände: Die effizienteste Art und Weise in SQL Server ein Datum von Datum + Zeit zu erhalten?
Ich habe anderswo einen ähnlichen Test mit ähnlichen Ergebnissen gesehen.
Ich bevorzuge DATEADD/DATEDIFF, weil:
- varchar unterliegt Sprach-/Datenformatproblemen
例 Warum ist mein CASE-Ausdruck nicht-deterministisch?
- float ist auf internen Speicher angewiesen
- Erweitert, um den ersten Tag des Monats, den morgigen Tag usw. zu berechnen, indem die Basis "0" geändert wird.
Bearbeiten, Oktober 2011
Für SQL Server 2008+ können Sie CAST auf date
d.h. CAST(getdate() AS date)
. Oder verwenden Sie einfach date
Datentyp also keine time
zu entfernen.
Bearbeiten, Jan 2012
Ein praktisches Beispiel dafür, wie flexibel dies ist: Ich brauche eine gerundete Zeit- oder Datumsangabe im Sql-Server
Bearbeiten, Mai 2012
Verwenden Sie dies nicht unbedacht in WHERE-Klauseln und dergleichen: Das Hinzufügen einer Funktion oder eines CAST zu einer Spalte macht die Verwendung des Index ungültig. Siehe Nummer 2 hier Häufige Fehler bei der SQL-Programmierung
Dies ist ein Beispiel dafür, wie spätere Versionen des SQL Server-Optimierers CAST bis zum Datum korrekt verwalten, aber allgemein es wäre eine schlechte Idee ...
Bearbeiten, Sep 2018, für datetime2
DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'
select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)
1 Stimmen
Ich habe dies mit einer Million Datensätzen in einer meiner Produktionstabellen ausprobiert und konnte in beiden Fällen keine genauen Angaben zur Leistung machen. Beide Methoden ergaben jedoch genau dieselbe Datenmenge.
0 Stimmen
Die Manipulation von Zeichenketten ist sehr viel CPU-intensiver. DATEADD und DATEDIFF sind so konzipiert, dass sie die von SQL Server verwendete Speicherdarstellung optimal nutzen.
9 Stimmen
Bei 18.000.000 Zeilen habe ich Folgendes gefunden (SQL Server 2008): Methode b ist etwa 24% langsamer als Methode a. CAST(FLOOR(CAST(getdate() AS FLOAT))) AS DATETIME) ist 3,5 % langsamer als Methode a. Methode a scheint in Bezug auf die Leistung ein Gewinner zu sein. Vielen Dank an alle für die tollen Antworten.
53 Stimmen
Warum zum Teufel hat SQL keine eingebaute Funktion für diese Aufgabe?!
12 Stimmen
Der neue Datentyp DATE von SQL 2008 wird dies übernehmen.
0 Stimmen
Ich habe versucht, CASTing die datetime zu einem Datum und es war sogar langsamer als Methode b. Wenn Sie nicht brauchen, um den Zeitteil zu speichern, dann würde dieser Datentyp sehr gut funktionieren.
3 Stimmen
Mögliche Duplikate von Die effizienteste Art und Weise in SQL Server zu erhalten Datum von Datum + Zeit?
0 Stimmen
Duplikat von Wie entfernt man den Zeitanteil eines Datetime-Wertes (SQL Server)?