Dieter: SQL-Abfrage fehlerhaft ?

Hallo,

irgendwie komme ich nicht weiter. Ich habe in meiner DB (MySQL)
folgende Sätze:

(db01)

id | agid | bustart    | buende
3  |  1   | 1188986401 | 1189418399
2  |  2   | 1188986401 | 1189418399
4  |  2   | 1199790001 | 1203245999
8  |  1   | 1199790001 | 1203245999
13 |  1   | 1180692001 | 1183283999

Meine Query lautet:

SELECT * FROM db01 WHERE agid = '1' AND (bustart BETWEEN '1182592801' AND '1182679199') OR (buende BETWEEN '1182592801' AND '1182679199')

Demmnach müsste doch ein Select mindestens einen Treffer rausgeben, da die Query doch zumindest auf den Datensatz mit der ID 13 zutrifft.

Doch leider bekomme ich immer ein Null-Ergebnis...

Habe ich irgendwo einen Denkfehler ???

Gruss
Dieter

  1. Hallo,

    SELECT * FROM db01 WHERE agid = '1' AND (bustart BETWEEN '1182592801' AND '1182679199') OR (buende BETWEEN '1182592801' AND '1182679199')
    Doch leider bekomme ich immer ein Null-Ergebnis...

    Quick-Shot: Meinst du vielleicht:

    SELECT * FROM db01 WHERE agid = '1' AND ( (bustart BETWEEN '1182592801' AND '1182679199') OR (buende BETWEEN '1182592801' AND '1182679199') )

    vereinfacht:

    agid=1 AND ( BED1 OR BED2)

    statt deiner Lösung

    agid=1 AND BED1 OR BED2

    Problem hier: Bool'sche Operatoren werden von links nach rechts aufgelöst => zuerst wird auf agid=1 AND BED1 auf true überprüft und dann mit OR BED2.

    Grüsse,

    Maxwell

    1. Hello,

      Problem hier: Bool'sche Operatoren werden von links nach rechts aufgelöst => zuerst wird auf agid=1 AND BED1 auf true überprüft und dann mit OR BED2.

      das ist nicht das Problem. Das Problem ist, dass die Rangfolge Bool'scher Operatoren NOT-AND-OR ist, das heißt die AND-Verknüpfung wird ausgeführt bevor die OR-Verknüpfung ausgeführt wird.

      MfG
      Rouven

      --
      -------------------
      He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
      1. Hello

        das ist nicht das Problem. Das Problem ist, dass die Rangfolge Bool'scher Operatoren NOT-AND-OR ist, das heißt die AND-Verknüpfung wird ausgeführt bevor die OR-Verknüpfung ausgeführt wird.

        Ah OK, dann war ich doch zu schnell beim Absenden.

        Grüsse,

        Maxwell

        1. Hallo nochmal,

          zuerst danke an alle, insbesondere an Rouven der mir meinen Denkfehler aufgezeigt hatte, da
          meine Query vom Ansatz her fehlerhaft ist. Hierfür erstmal sorry für die gemachte Mühe...
          Wie ich schon geschrieben hatte, war bzw. ist dieses mein Versuch, über eine Query festzustellen,
          ob ein über Timestamps definiertes Zeitfenster ein zweites überschneidet bzw. sich innerhalb dieses
          Zeitfensters bewegt. Hierzu habe ich also dementsprechend 4 Werte, wobei Wert 01 und Wert 02
          das vorgebene Zeitfenster (A) innerhalb der DB (bustart/buende) darstellen und ich nun über
          einen SELECT feststellen möchte, ob sich das Zeitfenster (B), also Wert 03 und Wert 04 innerhalb
          dem Zeitfenster (A) sich befindet.

          Ich versuche dieses nun mit folgender Anweisung zu realisieren:
          SELECT * FROM db01 WHERE agid = 'angebotid' AND ( (WERT03 BETWEEN WERT01 AND WERT02) OR (WERT04 BETWEEN WERT01 AND WERT02) )
          (Das nur für alle die ein ähnliches Problem haben und genauso "krumm" denken wie ich)

          Vielen Dank nochmal an alle !

          Gruss
          Dieter

      2. Hallo nochmal,

        die Feldtypen sind Zahlenwerte (Dezimal), die Query soll gegegenprüfen ob
        a) ein gespeicherter Wert A (bustart) innerhalb Wert 01 und 02 ODER Wert 03 und Wert 04 liegt
        und
        b) ein gespeicherter Wert B (buende) innerhalb Wert 01 und 02 ODER Wert 03 und Wert 04 liegt
        Mit num_rows will ich eigentlich nur dann feststellen, ob die Select zutrifft oder nicht.
        Wie kann ich denn eine solche Abfrage erreichen ?

        Gruss
        Dieter

  2. Hello,

    Demmnach müsste doch ein Select mindestens einen Treffer rausgeben, da die Query doch zumindest auf den Datensatz mit der ID 13 zutrifft.

    wieso?? Mal vorausgesetzt, dass deine Spalten überhaupt numerischen Typs sind (keine Ahnung, was BETWEEN bei Texten macht) - deine Kriterien beginnen allesamt mit 1182... - ich sehe leider keinen Satz, der 1182 in einer der Spalten hat.

    MfG
    Rouven

    --
    -------------------
    Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
    1. Hallo Rouven,

      deine Kriterien beginnen allesamt mit 1182... - ich sehe leider keinen Satz, der 1182 in einer der Spalten hat.

      Autsch, ja, Denkfehler.
      Jetzt stehe ich aber total auf dem Schlauch.
      Ich habe benannte Tabelle in der eine Startzeit und eine Endzeit (bustart/buende) als numerischer Timestamp (änderungen hieran in ein reines Date-Format NICHT mehr möglich) vorliegen.
      Nun möchte ich erreichen, das eine Überprüfung erfolgt, die gegenprüft ob ein ebenfalls als Timestamp benannter Zeitraum (Start/Ende) sich mit den gespeicherten Werten überschneidet.

      Beispiel:
      Gespeicherter Start - 1122990000
      Gespeichertes Ende  - 1133990000

      Zu prüfender Zeitraum:
      Start - 11239900
      Ende  - 11249900

      Liegt nun der zu prüfende Zeitraum innerhalb des gespeicherten Zeitfensters ? Hierfür müsste ich entsprechende Query aufbauen,
      jedoch ist hierbei zu beachten, das die gespeicherten Zeiträume jeweils über das Feld agid einen Angebot zugewiesen sind und das
      die Überprüfung jeweils zu dem Angebot passen muß.

      Deshalb denke ich, das meine Query logischweise erstmal mit
      SELECT * FROM db01 WHERE agid = 'anbgebotid' beginnen muß.
      Wie aber nun weiter ???

      Gruss
      Dieter

      1. fast unabhängig davon was Du vorhast, die Kombination aus

        • Bedingungen, mit OR oder AND verbunden
        • Datums- und Zeitfunktionen
        • Stringfunktionen (zum "Zerhacken" und wiederzusammensetzen von Strings zu datetime-Werten bspw.)
          wird Dich zusammen mit schrittweisem Vorgehen und der bereits mehrfach zitierten Problemisolierung (dieses gerne auch hier wieder vorstellen) ans Ziel bringen.

        Grundsätzlich ist das Forum - sofern Wir das richtig verstanden haben ;) - dafür geeignet bei der Problemlösung (des isolierten Problems ;) zu helfen oder konzeptionelle Fragen zu bearbeiten.

        1. Hello,

          Grundsätzlich ist das Forum - sofern Wir das richtig verstanden haben ;) - dafür geeignet bei der Problemlösung (des isolierten Problems ;) zu helfen oder konzeptionelle Fragen zu bearbeiten.

          na ja, das Problem ist mittlerweile IMHO hinreichend isoliert. Die Frage lautet: Wie kann ich überprüfen, ob sich zwei Zeiträume überschneiden?
          Zugegeben, das kann man am Besten erstmal mit Stift und Papier und etwas Überlegung lösen. Daher der Vorschlag an Dieter:
          Überlege dir, wie eine Überschneidung aussehen kann!

          1. gespeicherter Start zwischen gesuchtem Anfang und Ende
          2. gesuchter Anfand zwischen gespeichertem Start und Ende
            ...

          Daraus baust du dann eine Menge OR-Vernüpfter BETWEEN-Anweisungen zusammen.

          MfG
          Rouven

          --
          -------------------
          "I wish it need not have happened in my time" - "So do I, and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us."  --  J.R.R. Tolkien: "The Lord Of The Rings: The Fellowship Of The Ring"
          1. Die Frage lautet: Wie kann ich überprüfen, ob sich zwei Zeiträume überschneiden?

            Die untere Grenze des Zeitraums 1 mit der oberen Grenze von Zeitraum 2 vergleichen sowei die obere Grenze von Zeitraum 1 mit der unteren Grenze von Zeitraum 2, that's it.

  3. Habe ich irgendwo einen Denkfehler ???

    Nun, wenn Du ein "NULL-Ergebnis" bekommst und an der Sinnhaftigkeit Deiner WHERE-Bedingungen zweifelst, dann fragt sich old King^Lully doch, warum Du nicht selbst experimentell die Problematik dermassen eingrenzt, dass der Kern der Frage offenbar wird ODER sich die ursprüngliche Frage, der ursprüngliche Verdacht, ganz auflöst.

    Hier liegt - wie eigentlich bei jeder fünften bis zehnten Frage eine fehlende bzw. mangelhafte

    PROBLEMISOLIERUNG

    vor. Ich rege an diesen Punkt in die FAQs des Forums an zentraler Stelle aufzunehmen!!

    1. Hallo,

      Hier liegt - wie eigentlich bei jeder fünften bis zehnten Frage eine fehlende bzw. mangelhafte

      PROBLEMISOLIERUNG

      vor.

      Das Problem ist, das ich offensichtlich "den Wald vor lauter Bäumen nicht sehe". Eine gesonderte Problemisolierung ist mir derzeit nicht gegeben, da das Problem offensichtlich in meiner AND/OR-Anweisung zu suchen ist - ich diese aber mit meinen (bescheidenen) Fähigkeiten nicht weiter isolieren kann und ich deshalb um einen Denkanstoss in die richtige Richtung bitte.

      Gruss
      Dieter

      1. Das Problem ist, das ich offensichtlich "den Wald vor lauter Bäumen nicht sehe". Eine gesonderte Problemisolierung ist mir derzeit nicht gegeben, da das Problem offensichtlich in meiner AND/OR-Anweisung zu suchen ist

        Die Du aber systematisch aufbauen könntest bis diese Deiner Anforderung gerecht wird.

        • ich diese aber mit meinen (bescheidenen) Fähigkeiten nicht weiter isolieren kann und ich deshalb um einen Denkanstoss in die richtige Richtung bitte.

        Understatement, nichts gegen Understatement, aber glauben tun Wir das alles nicht.   ;)

        Kopf hoch, dem SELF-Gedanken ein wenig frönen und Du wirst nach Selbstauflösung bzw. optimaler Isolierung des Problems auch das Gefühl haben etwas geleistet zu haben. (Das möchten Wir an dieser Stelle auch allen Hartz IV-Empfängern zurufen und für die Überbrückungszeit die leckerne Kartoffelrezepte der Wikipedia empfehelen. ;)