Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Nach Uhrzeiten im datetime suchen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von CyberCobold, 24 Mai 2021.

  1. CyberCobold

    CyberCobold Neuer Benutzer

    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.
     
  2. Dukel

    Dukel Datenbank-Guru

  3. dabadepdu

    dabadepdu Datenbank-Guru

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    prinzipiell wäre für sowas ein funktionaler Index sehr nützlich, ich weiß aber nicht, ob M$SQL sowas schon kann.
     
  5. dabadepdu

    dabadepdu Datenbank-Guru

    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.
     
  6. CyberCobold

    CyberCobold Neuer Benutzer

    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;
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden