Nach Uhrzeiten im datetime suchen

CyberCobold

Neuer Benutzer
Beiträge
2
Hallo zusammen,
ich bin neu hier in dem Forum und möchte mir SQL beibringen.
Zur Zeit hänge ich an einem Problem, wo ich auch keine Hilfe finden kann.(Oder ich verstehe die Hilfen nicht)
Auch in diesem Forum habe ich nichts gefunden. Vielleich stelle ich aber auch meine Frage falsch, da ich mir nicht vorstellen kann, das ich der einzige bin mit so einem Problem
Da ich echt erst seit ein paar Tagen mit SQL experimentiere fällt es mir noch sehr schwer. Und ich hoffe es kann mir einer Helfen.

Also zu meiner Frage:
Wenn ich in der Datenbank eine Spalten habe im Format "Datetime" (2020-01-12 15:32:22) als Beispiel und
ich jetzt alle Einträge kleiner 16:00Uhr suchen möchte, wie muss ich das machen? Versucht habe ich folgende Varianten, die bei mir aber alle nicht gehen.

Variante 1:
SELECT *
FROM Bestellunge
WHERE Bestellzeitpunkt extract(hour from time) <16;

Variante 2:
SELECT *
FROM Bestellunge
WHERE Bestellzeitpunkt extract(hour from Datetime) <16;

Variante 3
SELECT *
FROM Bestellunge
WHERE HOURE(Bestellzeitpunkt) <16;

Das muss doch sicher gehen.
Mit Jahreszahlen geht es gut.
 
Werbung:
Das wäre eine Möglichkeit. Aber wie sinnvoll ist eine solche Abfrage, sobald es mehrere Tage in Deiner DB gibt?
Außerdem verletzt diese Form der Abfrage einen vielleicht vorhandenen Index auf der Spalte und würde ohne weiteres immer dazu führen, dass ein Full Scan aller Datensätze der Tabelle gefahren werden muss, auch wenn Du nur einen als Ergebnis benötigst.

Es ist immer eine gute Idee, die Kriterien Parameter vom Typ her an das abgefragte Feld anzupassen, nicht umgekehrt.
Hier mir convert(Datetime, <mein Parameter>, Format)
Also einen Datumstring in Datetime umzuwandeln oder innerhalb der Anwendung in einen kompatiblen Datetime Typ
Der Rest, also die gewünschte Bereichseinschränkung kann dann über eine Range bzw. Between Abfrage erledigt werden
Select <meine Feldliste> from <meine Tabelle> where <meineDateTimeSpalte> between <Untergrenze> and <Obergrenze>

Schau hier, wie convert funktioniert bei Datetime Spalten und String Parametern funktioniert:
Convert String to Datetime in SQL Server
 
Es gibt wohl sowas ähnliches, ich würde es mal als müden Abklatsch eines Function Based Index bezeichnen. Es erfordert scheinbar einen Eingriff ins Datenmodell, wo ich wirklich nicht verstehen kann wozu das so aufgezogen wurde.
Aber mir ist es auch egal. Schön dass es Function Based Indizierung gibt, wenn es mal nicht anders geht. In meinen Augen ist es alles andere als ein Allzweckhilfsmittel. Ich möchte meine DB nicht für jede neue Abfrage mit Function Based Indices zuballern, wenn es wie beschrieben ganz einfache, allgemeingültige Alternativen gibt.
 
Werbung:
Hallo zusammen,
sorry das ich mich erst jetzt zurückmelde, hatte aber vorher keine Zeit.

Vielen Dank für eure freundlichen Rückmeldungen, dass ist nicht leider nicht in allen Foren so.

Ich habe es mal so wie es dabadepdu beschrieben hat versucht und es hat geklappt.

Genau so habe ich mir das vorgestellt, aber nicht hinbekommen.

SELECT *
FROM TestDatenbnak
WHERE Day(Zeitpunkt) = 12 and DATAPART(HOUR;Zeitpunkt) between 12 and 19;
 
Zurück
Oben