Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bester Ansatz, um den Zeitteil von datetime in SQL Server zu entfernen

Streng genommen Methode a ist am wenigsten ressourcenintensiv:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Erwiesenermaßen weniger CPU-intensiv für die gleiche Gesamtdauer von einer Million Zeilen von jemandem mit viel zu viel Zeit:Effizienteste Methode in SQL Server, um ein Datum aus Datum und Uhrzeit zu erhalten?

Ich habe auch anderswo einen ähnlichen Test mit ähnlichen Ergebnissen gesehen.

Ich bevorzuge DATEADD/DATEDIFF, weil:

  • Varchar unterliegt Sprach-/Datumsformatproblemen
    Beispiel:Warum ist mein CASE-Ausdruck nicht deterministisch?
  • float ist auf internen Speicher angewiesen
  • erweitert, um den ersten Tag des Monats, morgen usw. zu berechnen, indem die Basis "0" geändert wird

Bearbeitet, Oktober 2011

Für SQL Server 2008+ können Sie auf date umwandeln d.h. CAST(getdate() AS date) . Oder verwenden Sie einfach date Datentyp, also keine time zu entfernen.

Bearbeitet, Januar 2012

Ein funktionierendes Beispiel dafür, wie flexibel dies ist:Berechnung nach gerundeter Zeit- oder Datumszahl in SQL Server erforderlich

Bearbeitet, Mai 2012

Verwenden Sie dies nicht in WHERE-Klauseln und dergleichen, ohne nachzudenken:Das Hinzufügen einer Funktion oder eines CAST zu einer Spalte macht die Indexverwendung ungültig. Siehe Nummer 2 hier Häufige Fehler bei der SQL-Programmierung

Nun, dies hat ein Beispiel für spätere Versionen des SQL Server-Optimierers, die CAST bisher korrekt verwalten, aber allgemein es wird eine schlechte Idee sein ...

Bearbeitet, September 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)