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.

1voto

Jamie G Punkte 81

Ich denke, wenn Sie sich strikt an die TSQL dass dies der schnellste Weg ist, die Zeit abzuschneiden:

 select convert(datetime,convert(int,convert(float,[Modified])))

Ich habe festgestellt, dass diese Trunkierungsmethode etwa 5 % schneller ist als die DateAdd Methode. Und das kann leicht geändert werden, um auf den nächsten Tag aufzurunden, etwa so:

select convert(datetime,ROUND(convert(float,[Modified]),0))

1voto

Dr. Andrew Punkte 2329

Wie wäre es mit select cast(cast my_datetime_field as date) as datetime) ? Das Ergebnis ist das gleiche Datum mit der Uhrzeit 00:00, aber ohne Konvertierung in Text und ohne explizite Rundung der Zahlen.

1voto

Alan Punkte 21

Nur für den Fall, dass jemand hier nach einer Sybase-Version sucht, da mehrere der oben genannten Versionen nicht funktionierten

CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
  • Getestet in I SQL v11 unter Adaptive Server 15.7

1voto

Max Vargas Punkte 376

Hier habe ich eine Funktion zum Entfernen einiger Teile einer Datetime für SQL Server erstellt. Verwendung:

  • Der erste Parameter ist die zu entfernende Zeitangabe.
  • Der zweite Parameter ist ein Zeichen:
    • s: rundet auf Sekunden; entfernt Millisekunden
    • m: rundet auf Minuten; entfernt Sekunden und Millisekunden
    • h: rundet auf Stunden; entfernt Minuten, Sekunden und Millisekunden.
    • d: rundet auf Tage; entfernt Stunden, Minuten, Sekunden und Millisekunden.
  • Gibt die neue Datumszeit zurück

create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, 'smhd',0) = 0 return @dt; return cast( Case @part when 's' then convert(varchar(19), @dt, 126) when 'm' then convert(varchar(17), @dt, 126) + '00' when 'h' then convert(varchar(14), @dt, 126) + '00:00' when 'd' then convert(varchar(14), @dt, 112) end as datetime ) end

1voto

Anton Gogolev Punkte 109749

Zeit für Beilagen/Aktualisierungen abziehen. Was die fliegende Konvertierung betrifft, so ist nichts besser als eine benutzerdefinierte Funktion, was die Wartbarkeit angeht:

select date_only(dd)

Die Umsetzung der date_only kann alles sein, was Sie wollen - jetzt ist es abstrahiert und der aufrufende Code ist viel sauberer.

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