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.

2voto

user1920017 Punkte 21

Für mich ist der folgende Code immer ein Gewinn:

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));

2voto

Carter Cole Punkte 910

Bereits beantwortet, aber ich werfe dies auch dort draußen... dies angeblich auch gut funktioniert, aber es funktioniert durch Wegwerfen der Dezimal (die Zeit speichert) aus dem Float und zurückgeben nur ganze Teil (die Datum ist)

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

Zum zweiten Mal habe ich diese Lösung gefunden... Ich habe diesen Code abgegriffen

2voto

Joel Coehoorn Punkte 377088

Siehe diese Frage:
Wie kann ich eine Datumsangabe in SQL Server abkürzen?

Was auch immer Sie tun, Verwenden Sie nicht die String-Methode . Das ist so ziemlich die schlechteste Art und Weise, wie man es machen kann.

2voto

Diego Punkte 1962

Select CONVERT(char(10), GetDate(),126)

1voto

Aaron West Punkte 11

Ich glaube, Sie meinen cast(floor(cast(getdate()as float))as datetime)

real ist nur 32-Bit, und könnte einige Informationen verlieren

Dies ist die schnellste cast(cast(getdate()+x-0.5 as int)as datetime)

...allerdings nur etwa 10% schneller (about 0.49 microseconds CPU vs. 0.58)

Dies wurde empfohlen und dauert in meinem Test auch so lange: DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

In SQL 2008 ist die SQL CLR-Funktion mit 1,35 Mikrosekunden gegenüber 6,5 Mikrosekunden etwa fünfmal schneller als eine SQL-Funktion, was auf einen wesentlich geringeren Funktionsaufruf-Overhead für eine SQL CLR-Funktion im Vergleich zu einer einfachen SQL UDF hinweist.

In SQL 2005 ist die SQL CLR-Funktion nach meinen Tests 16 Mal schneller als diese langsame Funktion:

create function dateonly (  @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end

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