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.

8voto

Jeff Meatball Yang Punkte 35809

Hier ist eine weitere Antwort, von einem anderen eine doppelte Frage:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 

Diese Methode der magischen Zahl ist etwas schneller als die DATEADD-Methode. (Es sieht nach ~10% aus)

Die CPU-Zeit bei mehreren Runden mit einer Million Datensätzen:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

Beachten Sie jedoch, dass diese Zahlen möglicherweise irrelevant sind, da sie bereits SEHR schnell sind. Solange ich keine Datensätze von 100.000 oder mehr hatte, konnte ich nicht einmal die CPU-Zeit auf über Null bringen.

In Anbetracht der Tatsache, dass DateAdd für diesen Zweck gedacht und robuster ist, würde ich sagen, verwenden Sie DateAdd.

6voto

emehex Punkte 8374

Das gefällt mir sehr:

[date] = CONVERT(VARCHAR(10), GETDATE(), 120)

En 120 Formatcode wird das Datum in den ISO 8601-Standard gezwungen:

'YYYY-MM-DD' or '2017-01-09'

Super einfach in dplyr zu verwenden ( R ) und Pandas ( Python )!

6voto

Byju Punkte 190
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

3voto

broslav Punkte 525

VORSICHT!

Die Methoden a) und b) haben NICHT immer das gleiche Ergebnis!

select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)

Output: 2014-01-01 00:00:00.000

select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)

Output: 2013-12-31 00:00:00.000

(Getestet auf MS SQL Server 2005 und 2008 R2)

EDIT: Laut Adams Kommentar kann dies nicht passieren, wenn Sie den Datumswert aus der Tabelle lesen, aber es kann passieren, wenn Sie Ihren Datumswert als Literal bereitstellen (Beispiel: als Parameter einer gespeicherten Prozedur, die über ADO.NET aufgerufen wird).

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.

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