between Abfrage für Daten will nicht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • between Abfrage für Daten will nicht

    Ok, ich hab folgendes Prob:
    Es geht um eine Art Buchungssys für Märkte und dass man Märkte halt nicht doppelt buchen können soll. Ich hab mir nun folgende Abfrage gebastelt um zu kontrollieren ob sich eine Buchung womöglich mit einer bereits vorhandenen schneidet.

    PHP-Code:
    "SELECT * FROM marktbuchungen WHERE 
    (

    (vondatum between '
    $vondatum' AND '$bisdatum') OR 
    (bisdatum between '
    $vondatum' AND '$bisdatum') OR 
    ('
    $vondatum' between vondatum AND bisdatum) OR 
    ('
    $bisdatum' between vondatum AND bisdatum)

    ) AND marktid = '
    $marktid'" 

    die ersten beiden Möglichkeiten funktionieren wunderbar, nur beiden letzten nicht. es gibt nichtmal einen SQL error.

    wenn man z.b. nen markt vom 1.1.2005 bis zum 30.1.2005 bucht und dann eine buchung macht, die vom 2.1.2005 bis zum 15.1.2005 geht, dann bemerkt er nicht, dass der markt in dem zeitraum schon belegt ist. Alle anderen Möglichkeiten funktionieren.
    kann mir da jemand weiterhelfen?

  • #2
    Re: between Abfrage für Daten will nicht

    Code:
    WHERE
    (vondatum between '$vondatum' AND '$bisdatum') OR 
    (bisdatum between '$vondatum' AND '$bisdatum') OR
    vondatum und bisdatum sind hier also keine platzhalter, sondern die spaltennamen?

    dann ergeben die bedingungen
    Code:
    ('$vondatum' between vondatum AND bisdatum) OR 
    ('$bisdatum' between vondatum AND bisdatum)
    in meinen augen gar keinen sinn ...

    Code:
    WHERE '[i]wert[/i]' BETWEEN [i]spalte_x[/i] AND [i]spalte_y[/i]
    - das ist unfug.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Code:
      WHERE 'wert' BETWEEN spalte_x AND spalte_y
      wie kann ich das denn sonst abfragen?

      der wert muss doch zwischen den beiden werten in den spalten liegen, damit man dann ne entsprechende Fehlermeldung oder andere Aktionen ausführen kann.

      Kommentar


      • #4
        wie wär's mit:

        where vondatum <= deinWert and bisdatum >= deinWert ?

        Kommentar


        • #5
          Auch mit dem between sollte es eigentlich funktionieren.
          Von welchem Typ/Format sind denn deine Daten?
          mein Sport: mein Frühstück: meine Arbeit:

          Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

          Kommentar


          • #6
            soo, jetzt hock ich wieder vor dem script.

            die variablen $vondatum und $bisdatum werden in selectfeldern ausgewählt und per
            Code:
            $vondatum = $HTTP_POST_VARS['vonjahr'].'-'.$HTTP_POST_VARS['vonmonat'].'-'.$HTTP_POST_VARS['vontag'];
            $bisdatum = $HTTP_POST_VARS['bisjahr'].'-'.$HTTP_POST_VARS['bismonat'].'-'.$HTTP_POST_VARS['bistag'];
            in das format der db gewandelt. die spalten in der db haben das format date. wenn ich das mit

            Code:
            "SELECT * FROM marktbuchungen WHERE 
            (
            (vondatum >='$vondatum' =< bisdatum) OR
            (vondatum >='$bisdatum' =< bisdatum)
            )
             AND marktid = '$marktid'"
            mache erhalte ich nen sql error

            Code:
            SQL_Fehler:You have an error in your SQL syntax. Check the manual that 
            corresponds to your MySQL server
             version for the right syntax to use 
            near '=< bisdatum) OR (vondatum >='2005-1-15' =< bisdatum)) 
            AND markt
            Zuletzt geändert von Aurelius; 28.09.2004, 11:06.

            Kommentar


            • #7
              Original geschrieben von Aurelius
              Code:
              WHERE (([b]vondatum >='$vondatum' =< bisdatum[/b])
              du möchtest dir die syntax, wie sie von asp2php gepostet wurde, noch mal anschauen.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                wenn ich das mit der syntax

                Code:
                SELECT * FROM marktbuchungen WHERE 
                vondatum <= $vondatum AND
                 bisdatum >= $vondatum AND 
                marktid = '$marktid'
                mache pasiert garnichts. in der DB ist eine buchung vom 01.01.2005 bis 30.01.2005 eingetragen und ic buche zu testzwecken z.b. vom 04.01.2005 bis 20.01.2005

                es tritt kein fehler auf, der markt wird einfach trotzdem gebucht, obwohl die bedingungen der abrage ja erfüllt sein sollten.
                Zuletzt geändert von Aurelius; 28.09.2004, 11:05.

                Kommentar


                • #9
                  dir ist klar, dass dein eingegebenes datum 04.01.2005 in 04-01-2005 umgewandelt wird und da du dummerweise vergessenhast, mysql zu sagen, dass das ein string ist, interpretiert mysql das als subtraktion und rechnet 04-01-2005 und raus kommt -2002 und damit wären die bedingungen nicht mehr erfüllt


                  ach ja: wenn du deinen beitrag so umbrechen würdest, dass mannicht nach rechts scrollen muss, wäre das sehr nett
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    auch wenn ich die variablen $vondatum und $bisdatum in der abfrage mit '' als string kennzeichne funzt das nicht. ich hab jetzt sogar schon so gearbeitet, dass ich die variablen garnet mehr benutze sondern die daten per hand in die querry setze

                    Code:
                    "SELECT * FROM marktbuchungen WHERE 
                                                vondatum <= '2005-01-07' 
                                                AND 
                                                bisdatum >= '2005-01-07' 
                                                AND marktid = '$marktid' "
                    aber auch hier findet er die vorhandene Buchung nicht.

                    Kommentar


                    • #11
                      Wie soll das auch bitte funktionieren? Hast Du dir Dein Abfrage mal genau angesehen?
                      h.a.n.d.
                      Schmalle

                      http://impressed.by
                      http://blog.schmalenberger.it



                      Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                      ... nur ohne :-)

                      Kommentar


                      • #12
                        Wie das funktionieren soll wüsste ich auch gerne...

                        Ich weiss nur, dass es hiermit wenigstens im Ansatz funktioniert hat:

                        Code:
                        "SELECT * FROM marktbuchungen WHERE 
                        (
                        
                        (vondatum between '$vondatum' AND '$bisdatum') OR 
                        (bisdatum between '$vondatum' AND '$bisdatum') 
                        
                        ) AND marktid = '$marktid'"
                        damit kann ich jedoch nur Überschneidungen abfangen, nicht jedoch Buchungen die im Zeitraum einer bereits vorhandenen Buchung liegen. Wieso funktioniert die Syntax hier und wenn ich =< oder >= benutze nicht?

                        Kommentar


                        • #13
                          Ok, es läuft, ich weiss nicht wieso oder weshalb aber es funktioniert.

                          hier die lösung:

                          PHP-Code:
                          "SELECT * FROM `marktbuchungen` WHERE (
                                          (vondatum <= '
                          $vondatum' AND bisdatum >= '$vondatum') OR
                                          (vondatum <= '
                          $bisdatum' AND bisdatum >= '$bisdatum') OR
                                          (vondatum between '
                          $vondatum' AND '$bisdatum') OR
                                          (bisdatum between '
                          $vondatum' AND '$bisdatum')
                                                      )
                                          AND marktid = '
                          $marktid'" 

                          Kommentar

                          Lädt...
                          X