Wie kann ich schreiben Sie eine where-Klausel in SQL zu filtern, die eine DATETIME-Spalte, indem Sie die Zeit des Tages?
Habe ich Daten erhalten einen Zeitstempel mit einer DATETIME-Spalte und will ich filtern Sie es nach unten, um die Menge der Datensätze, in denen die DATETIME ist zwischen 9:30 und 5:30 Uhr für jeden Tag. Was ist der beste Weg, dies zu tun?
UPDATE: Geändert, weil ich brauche die Präzision der minute, nicht nur Stunden. Tut mir Leid, dass.
InformationsquelleAutor Bialecki | 2009-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie immer schreiben Sie es als eine benutzerdefinierte Funktion, besonders wenn Sie müssen, tun dies regelmäßig
verwenden und dann wie so
Getestet mit den folgenden in SQL Server 2005
Ergebnisse in
Cam: das wird verhindern, Dass ein index verwendet, für die Datum-Spalte in Frage.
Es könnte besser sein, um den ersten filter zu einem bestimmten Tag (kann einen index verwenden) und dann eine zweite Klausel filter nach Zeit.
Ich Stimme mit dem denken und mit einem index wäre die ideale option, aber wie würde man das in der Praxis wenn die OP muss ein Datum mit timepart zwischen 9:30 und 5:30 Uhr?
InformationsquelleAutor Russ Cam
Analog zum obigen code, fügen Sie einfach die DATEPART(mi, Spalte) für Ihre Anforderung MINUTE
Beachten Sie jedoch, dieses leiden in der performance-Funktionen, auf die Spalten wird vermeiden Sie die Verwendung von index (non-sargeable)
Wenn Sie mit SQL 2008, haben Sie DATUM und ZEIT, neue Datentypen, die Sie verwenden können, um zu vergleichen. Wenn nicht, SQL 2005, vielleicht können Sie erstellen, die berechnete Spalten für ZEIT-Teil und nutzen es
InformationsquelleAutor jerryhung
Feste, kümmern sich um die Minuten jetzt
Ich glaube nicht, dass das funktioniert. Wegen der ANDs, es werden nur Datensätze zurück, bei denen die minute genau 30.
Das ist falsch! Erstens, es ist ein Tippfehler: mm=Monat, es sollte mi (oder n) für die Minuten. Aber selbst wenn, ich korrigiere den Tippfehler, wird die Abfrage nur zurückgeben 9:30, 10:30, 16:30, 17:30 etc.
Bah, du hast Recht Bialecki. Ich über-bearbeitet und ein Chaos. Und Lukas, chill-out. Wechseln Sie zu entkoffeinierten Kaffee. Etwas.
InformationsquelleAutor TheTXI
Alternativ:
Nur Ihre @start_time und der @end_time-1900-01-01 mit der Zeit benötigt.
Wird ausschließen 05:00:00.000 Uhr, aber Sie sollten in der Lage sein zu passen, wenn nötig. Beachten Sie auch, dass es nicht effizient nutzen Indizes für diese Suche. Wenn die Zeit, der Tag wird dann Häufig für die Suche verwendet werden oder Berechnungen, die Sie könnte prüfen, trennen Sie es heraus und halten Sie das DATUM und die UHRZEIT auf zwei Spalten.
InformationsquelleAutor Tom H
InformationsquelleAutor LukeH
Entweder so etwas wie dieses:
alternativ:
oder auch:
Kein index verwendet werden kann, für das jede dieser Abfragen. Ein index, pre-Berechnung der Werte die eine oder andere Art, und speichern Sie Sie in eine indizierte Spalte.
InformationsquelleAutor Tomalak
Verketten von Stunden und Minuten, und vergleichen Sie das Angebot.
InformationsquelleAutor Sung M. Kim
Diese glaube ich mit index. Ich kann nicht testen, ich poste das auch mit ipod
[EDIT von meinem computer]
Wird dies immer noch einen index verwenden, da wir nicht einen Ausdruck auf der linken Seite der where-Bedingung.
InformationsquelleAutor Michael Buen