595 Stimmen

Beste Methode zum Entfernen des Zeitteils von datetime in SQL Server

Welche Methode bietet die beste Leistung beim Entfernen des Zeitanteils aus einem Datetime-Feld in SQL Server?

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

oder

b) select cast(convert(char(11), getdate(), 113) as datetime)

Bei der zweiten Methode werden zwar ein paar Bytes mehr gesendet, aber das ist vielleicht nicht so wichtig wie die Geschwindigkeit der Konvertierung.

Beide scheinen auch sehr schnell zu sein, aber es könnte einen Unterschied in der Geschwindigkeit geben, wenn es um Hunderttausende oder mehr Zeilen geht?

Ist es auch möglich, dass es noch bessere Methoden gibt, um den Zeitanteil einer Datumsangabe in SQL loszuwerden?

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.

626voto

gbn Punkte 407102

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)

83voto

Anto Raja Prakash Punkte 1288

In SQL Server 2008 können Sie verwenden:

CONVERT(DATE, getdate(), 101)

66voto

Arjan Fraaij Punkte 641

Natürlich ist dies ein altes Thema, aber um es zu vervollständigen.

Ab SQL 2008 können Sie den Datentyp DATE verwenden, so dass Sie einfach tun können:

SELECT CONVERT(DATE,GETDATE())

29voto

Metaphor Punkte 5830

In SQL Server 2008 gibt es einen DATE-Datentyp (auch einen TIME-Datentyp).

CAST(GetDate() as DATE)

o

declare @Dt as DATE = GetDate()

19voto

Gary McGill Punkte 25122
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

...ist no eine gute Lösung, wie in den Kommentaren unten zu lesen ist.

Ich würde diese Antwort löschen, aber ich lasse sie hier als Gegenbeispiel stehen, da ich denke, dass die Erklärung der Kommentatoren zu warum dass es keine gute Idee ist, ist trotzdem nützlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X