SQL - WHERE Klausel um nach einem Datum zu suchen

Dieses Thema im Forum "Webmaster Hilfe / Programmierer Forum" wurde erstellt von Dark-Nightmare, 13.12.2013.

  1. #1 Dark-Nightmare, 13.12.2013
    Dark-Nightmare

    Dark-Nightmare Erfahrener Benutzer

    Dabei seit:
    21.01.2007
    Beiträge:
    1.807
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hi,

    ich habe gerade ein Problem mit SQL. Ich versuche nach einem Datum zu suchen, aber ich mache da irgend etwas falsch.

    Code:
    SELECT preis AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' AND [B]bucht.fabflug = '31.10.13'[/B];
    Ausschnitt aus der Tabelle Preis:
    Code:
     PASSAGIER FNUMMER FABFLUG       PREIS KLASSE     SITZ BUCHUNGSNR
    ---------- ------- -------- ---------- ---------- ---- ----------
          1004 PW0001  31.10.13        150 Economy    6F      2.0E+12 
          1003 PW0001  31.10.13        210 Business   1A      2.0E+12 
    

    Die Abfrage für Date ist falsch. Wenn ich das ; vor das AND setze, funktioniert es. Leider finde ich den Fehler nicht. Habe es schon mit Date, to_Date etc. probiert. Sagen wir einfach alles, was ich bei google so gefunden habe. Aber dass scheint alles nicht zu funktionieren.

    Weiß jemand von euch, was vor '31.10.13' stehen muss damit die Ausgabe klappt?

    Ich arbeite mit dem Oracle SQL Devoloper.
     
  2. AdMan

    schau mal hier: Windows-Wartungs-Tool. Viele Probleme lassen sich damit einfach beheben. Oftmals ist der PC dann auch schneller!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren.
  3. #2 xandros, 13.12.2013
    Zuletzt bearbeitet: 13.12.2013
    xandros

    xandros IT Consultant, Cisco Registered Partner
    Moderator

    Dabei seit:
    05.07.2007
    Beiträge:
    25.885
    Zustimmungen:
    91
    Ort:
    Umkreis Duisburg, neben Mannheim, hinter Hamburg
    SQL verwendet das Datumsformat in der Regel in englischer Notation. Mit der deutschen Form (welche nur fuer die Anzeige verwendet wird!) kommst du in einer SQL-Query nicht weit.

    to_date war schon korrekt. Vielleicht hast du das Format dabei nicht korrekt angegeben.
    Code:
    SELECT preis AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' AND bucht.fabflug = [COLOR="Red"]to_date([/COLOR]'31.10.13'[COLOR="red"],'dd/mm/yy')[/COLOR];
    Habe selbst keine Oracle-/PLSQL-DB im Einsatz. Daher ist die obige Abfrage nur als grober Anhaltspunkt zu betrachten.
    Es wuerde mich jedoch nicht wundern, wenn die Datumswerte nicht nur in dem Format MM/DD/YY vorliegen, sondern vielmehr als MM/DD/YY hh:mm:ss.
    Das fuehrt dann natuerlich dazu, dass eine Abfrage fuer das Datum "31.10.13" ausschliesslich Datensaetze liefert, die exakt "31.10.13 00:00:00" enthalten, aber Datensaetze mit Datum "31.10.13 00:00:01" bereits nicht mehr beruecksichtigt.
    Von daher wuerde ich das Datum aus der Tabelle auf den Suchbegriff fuer den Vergleich herunterstutzen und die Stunden/Minuten/Sekunden-Angabe abschneiden.
    Code:
    SELECT preis AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' AND [COLOR="SeaGreen"]trunc([/COLOR]bucht.fabflug[COLOR="SeaGreen"],'dd/mm/yy')[/COLOR] = [COLOR="Red"]to_date([/COLOR]'31.10.13'[COLOR="red"],'dd/mm/yy')[/COLOR];
     
  4. #3 Dark-Nightmare, 13.12.2013
    Dark-Nightmare

    Dark-Nightmare Erfahrener Benutzer

    Dabei seit:
    21.01.2007
    Beiträge:
    1.807
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hi Xandros,
    danke für deine Hilfe!

    Aber irgendwie haut es noch nicht ganz hin. Ich denke du hast recht mit der Zeit. Wenn ich deine erste Variante ausprobiere, findet er nichts.

    Die trunc Variante habe ich jetzt etwas angepasst. Mein jetziges Problem ist nun nur noch, dass ist gleich nicht funktioniert.

    Code:
    SELECT preis AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' AND bucht.fabflug  [B]> [/B]TRUNC(TO_DATE('31/10/13','dd/mm/yy'));
    
    Das funktioniert aber zeigt mir nun alle Preise an, von jedem Flug mit der Nummer PW0001.

    Code:
    SELECT preis AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' AND bucht.fabflug [B] = [/B]TRUNC(TO_DATE('31/10/13','dd/mm/yy'));
    
    Versuche ich das ganze mit ist gleich findet er wieder nichts und Gesammtpreis ist leer.
     
  5. #4 xandros, 13.12.2013
    Zuletzt bearbeitet: 13.12.2013
    xandros

    xandros IT Consultant, Cisco Registered Partner
    Moderator

    Dabei seit:
    05.07.2007
    Beiträge:
    25.885
    Zustimmungen:
    91
    Ort:
    Umkreis Duisburg, neben Mannheim, hinter Hamburg
    Wenn du von deinem Suchbegriff die NICHT VORHANDENE Uhrzeit abschneidest, bringt das nicht sonderlich viel. Die Uhrzeit muss vom Tabellenwert fuer den Vergleich entfernt werden.
    Anstelle von
    ... = TRUNC(TO_DATE('31/10/13','dd/mm/yy'))
    gehoert da m.M.n also
    .. AND TRUNC(bucht.fabflug, 'dd/mm/yy') = TO_DATE(....)
    hin

    Zum ersten SQL-Statement:
    Das ">" in der zweiten Bedingung sagt ja lediglich aus, dass alle Datensaetze mit dieser Flugnummer ab dem angegebenen Datum (31.10.13 00:00:00) verwendet werden sollen.
    Das schliesst dann natuerlich auch Ergebnisse ein, die z.B.
    31.10.13 05:15:45 AM
    31.10.13 11:59:59 PM
    15.12.13 07:49:32 AM
    etc. enthalten und somit nach dem 31.10.13 00:00:00 AM liegen.

    Ich habe noch eine weitere Vermutung zum testen.....
    Eventuell ist es leichter zu handhaben, wenn man anstelle von Datumsvergleichen hier mit Strings arbeitet.
    Der Where-Teile wuerde dann z.B. etwa so aussehen:
    Code:
    WHERE bucht.fnummer = 'PW0001' AND to_char(trunc(bucht.fabflug,'dd/mm/yy')) = '31.10.13';
    Eventuell wirst du die Slashes (/) im Datumsformat mit Punkten (.) austauschen koennen/duerfen/muessen oder du verwendest generell das US-Format in Abfragen und schreibst dann auch dein Suchstring entsprechend als "10/31/13".


    Du kannst dir beim Testen auch separate Spalten ausgeben lassen, in der du die Tabelleninhalte anzeigen laesst.
    Wenn du beispielsweise die Where-Klausel komplett beiseite laesst und zuerst einmal nur
    Code:
    SELECT preis AS Gesammtpreis, trunc(bucht.fabflug,'dd/mm/yy') as Tabdatum, to_date('31.10.13','dd/mm/yy') as Suchdatum
    FROM bucht
    ausgibst, dann sollte in der Uebersicht als Spalte "Tabdatum" der von trunc() aufbereitete Wert auftauchen und in der Spalte "Suchdatum" der von to_date() aufbereitete Wert fuer das Vergleichsdatum. Wenn die Werte nicht uebereinstimmen, koennen sie auch in einer Where-Klausel nicht als Vergleich fuer Treffer sorgen.
    Gleiches waere dann der Fall, wenn du die Tabellenwerte in Strings umwandelst und dafuer z.B.
    Code:
    SELECT preis AS Gesammtpreis, to_char(trunc(bucht.fabflug,'dd/mm/yy')) as Tabdatum, '31.10.13' as Suchdatum
    FROM bucht
    verwendest. (Auch hier wieder bei Bedarf die Slashes in den Formaten mit Punkten austauschen.)
     
  6. #5 Dark-Nightmare, 13.12.2013
    Dark-Nightmare

    Dark-Nightmare Erfahrener Benutzer

    Dabei seit:
    21.01.2007
    Beiträge:
    1.807
    Zustimmungen:
    0
    Ort:
    Hamburg
    Mit der Where-Klausel hast du natürlich recht. Ich wollte eigentlich darauf hinaus, dass mir bei > etwas ausgegeben wird.

    Wenn ich es nun so versuche:

    Code:
    SELECT preis AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' AND TRUNC (bucht.fabflug, 'dd/mm/yy')  = TO_DATE('31/10/13','dd/mm/yy');
    
    Kommt dieser Fehler:

    ORA-01898: Zu viele Angaben für Gesamtstellenzahl
    01898. 00000 - "too many precision specifiers"
    *Cause: While trying to truncate or round dates, extra data was found in the
    date format picture
    *Action: Check the syntax of the date format picture and retry.
     
  7. #6 xandros, 13.12.2013
    xandros

    xandros IT Consultant, Cisco Registered Partner
    Moderator

    Dabei seit:
    05.07.2007
    Beiträge:
    25.885
    Zustimmungen:
    91
    Ort:
    Umkreis Duisburg, neben Mannheim, hinter Hamburg
    Sorry! Manchmal habe ich die Angewohnheit meine Texte unmittelbar nach dem Senden nochmal zu ueberarbeiten.
    Ist diesmal auch geschehen.....

    Zeigt schon, dass in den Datumsspalten tatsaechlich Uhrzeitwerte enthalten sind.
     
  8. AdMan

    Es ist generell erstmal empfehlenswert alle ggf. veralteten oder fehlerhaften Treiber zu scannen und auf neue zu aktualisieren. Hier kannst du einen Treiber-Scanner downloaden. Das erspart oftmals viel Ärger und hilft gegen diverse Probleme.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren.
  9. #7 Dark-Nightmare, 14.12.2013
    Dark-Nightmare

    Dark-Nightmare Erfahrener Benutzer

    Dabei seit:
    21.01.2007
    Beiträge:
    1.807
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hi Xandros,
    getreu nach dem Motto: Neuer Tag, neues Glück habe ich es nun geschafft :)

    Ich bin mir nicht sicher, aber ich glaube den TRUNC Befehl gibt es bei Oracle nicht ?!

    Funktioniert hat es nun so:
    Code:
    SELECT SUM (preis) AS Gesammtpreis
    FROM bucht
    WHERE bucht.fnummer = 'PW0001' 
    AND to_date(to_char(flug_bucht.fabflug, 'dd.mm.yy'), 'dd.mm.yy') = '31.10.13';
    
    Danke für die Hilfe :D
     
  10. #8 Dark-Nightmare, 15.12.2013
    Zuletzt bearbeitet: 15.12.2013
    Dark-Nightmare

    Dark-Nightmare Erfahrener Benutzer

    Dabei seit:
    21.01.2007
    Beiträge:
    1.807
    Zustimmungen:
    0
    Ort:
    Hamburg
    So ich merke beim lernen, dass ich noch ein paar Fragen zu SQL habe :)

    Mein erstes Problem ist:
    Ich möchte nur die Flugzeugtypen ausgeben lassen, die in der Tabelle wartet länger gewartet werden müssen als die Durchschnittszeit aller Flugzeuge.

    Meine Idee war:
    Code:
    SELECT flug_wartet.typ
    FROM flug_wartet
    WHERE (to_char(((flug_wartet.bis - flug_wartet.von)*1440))) > 
    (AVG (to_char(((flug_wartet.bis - flug_wartet.von)*1440))));
    
    WHERE (to_char(((flug_wartet.bis - flug_wartet.von)*1440)))
    Damit wollte ich die Zeit berechnen, die benötigt wird um ein Flugzeug zu warten

    und damit wollte ich die Durchschnittszeit aller Flugzeuge berechnen.
    (AVG (to_char(((flug_wartet.bis - flug_wartet.von)*1440))))

    Scheint auch beides zu funktionieren. Nur in der WHERE Klausel, macht das AVG Probleme.



    Mein zweites Problem hängt wieder mit DATE zusammen.

    Nun habe ich eine Abflugszeit als DATE Format, dort ist auch eine Uhrzeit hinterlegt z.B.: 01.01.2013 09:00:00.
    In der nächsten Spalte steht die Flugdauer z.B. 90 (Number). Wie schaffe ich es nun, dass ich auf die 09:00:00 die 90 addieren kann und dann die berechnete Uhrzeit ausgeben kann? Ich möchte die 90 natürlich aus der Spalte holen und nicht als festen Wert angeben.

    Mein Versuch sieht so aus:
    Code:
    SELECT (to_char (flug_flug.fabflug + (flug_flug.fdauer/1440), 'hh24:mm:ss'))
    FROM flug_flug
    WHERE to_date(to_char(flug_flug.fabflug, 'dd.mm.yy'), 'dd.mm.yy') = '01.01.13';
    
    Nun wird aber leider nur 60min addiert und nicht 90 min.
     
Thema:

SQL - WHERE Klausel um nach einem Datum zu suchen

Die Seite wird geladen...

SQL - WHERE Klausel um nach einem Datum zu suchen - Ähnliche Themen

  1. Auf der Suche nach Datingtipps!

    Auf der Suche nach Datingtipps!: Suche alles zum Thema Flirten. Internetseiten gerne auch. Sowas z.B. dating-akademie.net
  2. Lenovo L412: Suche nach Handbuch und Problem mit der Tastaturbelegung

    Lenovo L412: Suche nach Handbuch und Problem mit der Tastaturbelegung: Hallo Ich habe unlängst ein Lenovo Thinkpad L412 gebraucht erstanden und habe jetzt 2 Probleme: Zum Notebook gab es kein Handbuch. Im Netz...
  3. Suche noch gutes Buch

    Suche noch gutes Buch: Ich will am WE mehr lesen. Ich habe mir zwar jetzt den Harry Potter-Teil auf englisch bestellt, aber ich brauche noch eins, falls das nix wird mit...
  4. Suche Service-Hotline für PC-Probleme!

    Suche Service-Hotline für PC-Probleme!: Guten Tag! Ich habe ein paar (größere) Software-Probleme und suche nach einer kompetenten Beratung via Telefon- das sollte fürs erste reichen!...
  5. Suche Xeon CPU

    Suche Xeon CPU: Hat jemand zufällig einen Intel Xeon X5470 übrig? Möchte mir einen MOd auf 775 raufhauen. Thnx