2009-09-15 10 views
50

Ich verwende MS SQL 2005, und ich möchte zwei Daten für die Gleichheit überprüfen, aber den Zeitteil ignorieren.Vergleichen Sie Daten in T-SQL, ignorieren den Zeitteil

Ich weiß, ich kann DATEDIFF verwenden, aber ich bin besorgt, dass es langsam sein kann - dieser SP wird in der DB viel verwendet!

Irgendwelche Vorschläge?

Edit: David Andres' Kommentar:

‚‚Vergleich‘umfasst viel mehr als Gleichheit‘
machte mir klar, dass ich nicht meine Frage klar genug machen - ich bin eigentlich nur für die Gleichstellung Kontrolle, das ist alles .

+10

Seien Sie nicht mit vorzeitiger Optimierung betroffen: Schreiben Sie Ihre Abfrage mit 'DATEDIFF', dann sehen Sie, ob es ein Engpass ist oder nicht den Abfrageplan zu untersuchen. Wenn es ein Problem ist, suchen Sie eine Alternative. – Welbog

+0

Mögliches Duplikat von [Beste Vorgehensweise zum Entfernen des Zeitanteils von datetime in SQL Server] (http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql- Server) – abatishchev

Antwort

81

Die einzige vernünftige Weg, dies zu tun ist, um die Zeitteil der Datetime-Werte abstreifen und die Ergebnisse vergleichen und die beste Art und Weise den Zeitanteil von einem Datetime-zu Streifen ist wie folgt:

cast(current_timestamp as date)  

Früher habe ich zu verwenden, und ein Verfahren einsetzen, das wie eine der beiden folgenden Zeilen sah:

cast(floor(cast(getdate() as float)) as datetime) 
dateadd(dd,0, datediff(dd,0, getDate())) 

Aber jetzt, dass SQL Server die Date Typ hat, die nicht eine Zeitkomponente hält, gibt es wenig Grund, entweder zu verwenden dieser Techniken.

Eine weitere Sache, die hier zu beachten ist, ist, dass eine Abfrage immer noch blockiert wird, wenn Sie sie für zwei datetime-Werte für jede Zeile in einer WHERE-Klausel oder einer Join-Bedingung ausführen müssen. Wenn möglich, möchten Sie dies irgendwie ausrechnen, so dass es so weit wie möglich vorberechnet wird, zum Beispiel mit einer View- oder berechneten Spalte.

Schließlich, die DATEDIFF-Funktion vergleicht die Anzahl der Grenzen überschritten. So ist der Da tiff in Tagen zwischen '2009-09-14 11:59:59' und '2009-09-15 00:00:01' 1, obwohl nur 2 Sekunden verstrichen sind, aber der DATEDIFF in Tagen zwischen '2009-09-15 00:00:01' und '2009-09-15 11:59:59' ist immer noch Null, obwohl 86.398 Sekunden verstrichen sind. Beachten Sie, dass es sich um den Zeitabschnitt dort überhaupt nicht kümmert. Je nachdem, was Ihre Abfrage versucht, können Sie dies zu Ihrem Vorteil verwenden.

+3

wäre das nicht weniger effizient als nur _DATEDIFF (day, date1, date2) _? –

+0

Ich arbeitete an einem Schnitt - es ist jetzt fertig. –

+2

Ich war nicht wirklich auf der Suche nach einer Möglichkeit, die Zeit auszustrecken, sondern eine Möglichkeit, zwei Termine zu vergleichen, die die Zeit ignorieren. Das sieht mir etwas langsamer. –

6

In meiner eigenen Arbeit, wenn ich, dass zwei Tage, waren gleich, unabhängig von der Tageszeit bestimmen wollte, habe ich die folgenden verwendet:

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

Zugegeben, „Vergleich“ umfasst viel mehr als Gleichheit und Das obige konvertiert die Daten in das USA-Format MM/TT/JJJJ, bevor der Vergleich durchgeführt wird. Also Auswirkungen auf die Leistung und Unfähigkeit, Datumsunterschiede zu vergleichen.

Aber ... es funktioniert.

4

Wenn eine Ihrer Geschäftsanforderungen von Ihrem Datenmodell nicht gut bedient wird (z. B. wenn Sie Daten vergleichen müssen, aber keine Termine, sondern nur Datum-plus-Zeiten), Schauen Sie sich die Möglichkeit an, das Modell zu stimmen, nicht die Methode, damit umzugehen.

Wäre es möglich und hilfreich, das Datum nur in einer indizierten berechneten Spalte zu speichern oder die Datums- und Uhrzeitteile getrennt zu speichern?

33

WHERE DATEDIFF (Tag, date1, date2) = 0

2

Sorry für die Verspätung Antwort.

Ich benutze immer diese Syntax für Datum Vergleich

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

es immer funktioniert gut, wenn wir das Datum mit 112 Format-Code umzuwandeln Datum in yyyyMMdd Format zurück. es vergleicht das Datum im String-Format ohne Zeit, funktioniert aber großartig. Danke

+0

Ihre Lösung arbeitete an einem Skript, das ich geschrieben habe, als "IF date_column! = GETDATE()" nicht ausgeführt wurde. Wissen Sie, warum das so ist? – CryptoJones

Verwandte Themen