it-swarm.com.de

Die effizienteste Methode in SQL Server, um Datum + Uhrzeit abzufragen?

Was ist in MS SQL 2000 und 2005 bei einer vorgegebenen Datumszeit wie '2008-09-25 12:34:56' der effizienteste Weg, um eine Datumszeit zu erhalten, die nur '2008-09-25' enthält?

Dupliziert hier .

73
Matt Howells

Ich muss zugeben, dass ich den von Matt gezeigten Umbau des Bodenschwimmers noch nicht gesehen hatte. Ich musste das testen.

Ich habe eine reine Auswahl getestet (die Datum und Uhrzeit zurückgibt und nicht das ist, was wir wollen), die hier vorherrschende Lösung (floor-float), eine hier erwähnte übliche "naive" (stringconvert) und die hier erwähnte, die ich war using (wie ich dachte, war es das schnellste).

Ich habe die Abfragen auf einem Testserver mit MS SQL Server 2005 getestet, der auf einem Win 2003 SP2-Server mit einer Xeon 3GHz-CPU mit maximalem Arbeitsspeicher (32 Bit, also ca. 3,5 GB) ausgeführt wird. Es ist Nacht, in der ich bin, sodass die Maschine fast ohne Last im Leerlauf läuft. Ich habe alles für mich.

Hier ist das Protokoll meines Testlaufs, der aus einer großen Tabelle mit Zeitstempeln bis zur Millisekunden-Ebene ausgewählt wurde. Dieser bestimmte Datensatz enthält Daten, die sich über 2,5 Jahre erstrecken. Die Tabelle selbst hat über 130 Millionen Zeilen, deshalb beschränke ich mich auf die oberste Million.

SELECT TOP 1000000 CRETS FROM tblMeasureLogv2 
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2 
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2

SQL Server-Analyse- und Kompilierungszeit: CPU-Zeit = 0 ms, verstrichene Zeit = 1 ms.

(1000000 betroffene Zeile (n)) Tabelle 'tblMeasureLogv2'. Scanzählung 1, logische Lesevorgänge 4752, physische Lesevorgänge 0, Vorlesevorgänge 0, logische Vorlesevorgänge 0, physische Vorlesevorgänge 0, Vorlesevorgänge 0.

SQL Server-Ausführungszeiten: CPU-Zeit = 422 ms, verstrichene Zeit = 33803 ms.

(1000000 betroffene Zeile (n)) Tabelle 'tblMeasureLogv2'. Scanzählung 1, logische Lesevorgänge 4752, physische Lesevorgänge 0, Vorlesevorgänge 0, logische Vorlesevorgänge 0, physische Vorlesevorgänge 0, Vorlesevorgänge 0.

SQL Server-Ausführungszeiten: CPU-Zeit = 625 ms, verstrichene Zeit = 33545 ms.

(1000000 betroffene Zeile (n)) Tabelle 'tblMeasureLogv2'. Scananzahl 1, logische Lesevorgänge 4752, physische Lesevorgänge 0, Vorauslesevorgänge 0, logische Lobs-Lesevorgänge 0, physikalische Lobs-Lesevorgänge 0, Lobs-Vorauslesevorgänge 0.

SQL Server-Ausführungszeiten: CPU-Zeit = 1953 ms, verstrichene Zeit = 33843 ms.

(1000000 betroffene Zeile (n)) Tabelle 'tblMeasureLogv2'. Scanzählung 1, logische Lesevorgänge 4752, physische Lesevorgänge 0, Vorlesevorgänge 0, logische Vorlesevorgänge 0, physische Vorlesevorgänge 0, Vorlesevorgänge 0.

SQL Server-Ausführungszeiten: CPU-Zeit = 531 ms, verstrichene Zeit = 33440 ms. SQL Server-Analyse- und Kompilierungszeit: CPU-Zeit = 0 ms, verstrichene Zeit = 1 ms.

SQL Server-Ausführungszeiten: CPU-Zeit = 0 ms, verstrichene Zeit = 1 ms.

Was sehen wir hier?

Konzentrieren wir uns auf die CPU-Zeit (wir betrachten die Konvertierung) und sehen, dass wir die folgenden Zahlen haben:

Pure-Select:  422
Floor-cast:   625
String-conv: 1953
DateAdd:      531  

Daraus ergibt sich für mich, dass der DateAdd (zumindest in diesem speziellen Fall) etwas schneller ist als die Floor-Cast-Methode.

Bevor Sie dorthin gingen, habe ich diesen Test mehrmals ausgeführt, wobei die Reihenfolge der Abfragen geändert wurde und dieselben Ergebnisse erzielt wurden.

Ist das etwas seltsames auf meinem Server, oder was?

111
Tomas
Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)

DateDiff (Day, 0, GetDate ()) ist dasselbe wie DateDiff (Day, '1900-01-01', GetDate ())

Da DateDiff eine Ganzzahl zurückgibt, erhalten Sie die Anzahl der Tage, die seit dem 1. Januar 1900 vergangen sind. Diese Ganzzahl wird dann zum 1. Januar 1900 addiert. Der Nettoeffekt ist das Entfernen der Zeitkomponente.

Ich sollte auch erwähnen, dass diese Methode für jeden Datums-/Zeitbereich (wie Jahr, Quartal, Monat, Tag, Stunde, Minute und Sekunde) funktioniert.

Select  DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select  DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select  DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select  DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select  DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select  DateAdd(Second, DateDiff(Second, '20000101', GetDate()), '20000101')

Der letzte für Sekunden erfordert eine besondere Behandlung. Wenn Sie den 1. Januar 1900 verwenden, erhalten Sie eine Fehlermeldung.

Der Unterschied zwischen zwei datetime-Spalten führte zur Laufzeit zu einem Überlauf.

Sie können diesen Fehler umgehen, indem Sie ein anderes Bezugsdatum verwenden (z. B. den 1. Januar 2000).

24
G Mastros
select cast(floor(cast(@datetime as float)) as datetime)

Funktioniert, da das Casting einer Datumszeit auf Floating die Anzahl der Tage (einschließlich Bruchteile eines Tages) seit dem 1. Januar 1900 angibt. Durch das Flooring werden die gebrochenen Tage entfernt und die Anzahl der ganzen Tage verbleibt, die dann auf eine Datumszeit zurückgesetzt werden können.

12
Matt Howells

in SQL Server 2012 verwenden

select cast(getdate() as date)
7
BrianMichaels
select cast(getdate()as varchar(11))as datetime
1
Aamod Chandra

Um JJJJ-MM-TT zu erhalten, verwenden Sie:

select convert(varchar(10), getdate(), 120)

Edit: Hoppla, er möchte ein DateTime anstelle eines Strings. Das Äquivalent von TRUNC () in Oracle. Sie können das, was ich gepostet habe, in ein DateTime zurückverwandeln:

select convert(datetime, convert(varchar(10), getdate(), 120) , 120)
0
Erick B

CAST(FLOOR(CAST(yourdate AS DECIMAL(12, 5))) AS DATETIME) schneidet bei weitem am besten ab. Sie können die Beweise und Tests sehen, wenn Abrufen des Datums ohne Uhrzeit in SQL Server

0
Andrew dh
0
Ricardo C

Drei Methoden, die im folgenden Link beschrieben werden. Ich habe sie nicht auf Leistung getestet, um festzustellen, welche am schnellsten ist.

http://www.blackwasp.co.uk/SQLDateFromDateTime.aspx

0
BlackWasp