Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Letzter Tag vom Datumsintervall fehlt

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Letzter Tag vom Datumsintervall fehlt

    Hallo liebes PHP.de-Forum,

    da ich noch frisch und neu hier bin, erst einmal ein "Hallo" in die Runde.
    Folgendes Problem stellt sich mir:

    Meine Abfrage lautet:
    Code:
    SELECT * FROM auftrag LEFT JOIN xxx on auftrag.wanr = xxx.wanr WHERE (Datum>='2014-07-15' AND Datum<='2014-07-18') AND HOUR(Datum) BETWEEN '06' AND '14'  AND Maschine = 'xxx'
    Damit möchte ich alle Aufträge von Maschine xxx im Zeitraum '2014-07-15' bis '2014-07-18' in der Frühschicht (6 bis 14 Uhr) abfragen.
    Funktioniert auch soweit super, nur der letzte Tag, sprich '2014-07-18' wird nicht mit abgefragt.

    Stellt sich die Frage: Warum? Wo liegt das (Syntax-)Problem?

    Falls ihr weitere Infos braucht, fragt einfach nach.

    Danke im Voraus und freundliche Grüße,
    Michael


  • #2
    Hi,

    Zeig mal bitte deine Tabellenstruktur.

    mfg Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Hallo wolf,

      meinst du die Tabellenstruktur von "auftrag" oder allgemein der DB?
      Kann ich die Struktur ggf. exportieren?

      Sorry, für die Zwischenfrage, aber da bin ich noch nicht hundertpro fit in solchen Dingen.

      Gruß,
      Michael

      Kommentar


      • #4
        Hi,

        die Tabellenstruktur der relevanten Tabellen + 1-2 Beispieldatensätze.

        mfg Wolf29
        while (!asleep()) sheep++;

        Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

        Kommentar


        • #5
          Tabelle "auftrag"
          Code:
          ID | int(10) | unsigned
          Datum | datetime
          WaNr | varchar
          ArtikelNr | varchar
          Maschine
          | varchar

          Tabelle "Maschine xxx":
          Code:
          Datum_von | datetime
          Datum_bis | varchar
          WaNr | varchar
          ArtikelNr | varchar
          Text | varchar
          Time
          | int

          Bsp. 1:
          Code:
          SELECT * FROM auftrag LEFT JOIN m01 on auftrag.wanr = m01.wanr WHERE (Datum>='2014-07-15' AND Datum<='2014-07-18') AND HOUR(Datum) BETWEEN '06' AND '14'  AND Maschine = 'm01'
          Bsp. 2:
          Code:
          SELECT * FROM auftrag LEFT JOIN m02 on auftrag.wanr = m02.wanr WHERE (Datum>='2014-07-10' AND Datum<='2014-07-13') AND HOUR(Datum) BETWEEN '06' AND '14'  AND Maschine = 'm02'

          Kommentar


          • #6
            Ich denke mal Datum ist DATETIME und er vergleicht eben mit "2014-07-18 00:00:00". Und für dieses Datum(Zeit) ist die Bedingung

            Code:
            Datum<='2014-07-18'
            nicht mehr erfüllt.

            Billigster Trick wäre wohl einfach einen Tag mehr zu nehmen, besser wäre irgendwas anderes, was ich aber nicht weiß.

            Edit: Doch was besseres gefunden:

            Code:
            WHERE (Datum BETWEEN '2014-07-10 00:00:00'  AND '2014-07-13 23:59:59')

            Kommentar


            • #7
              Hi alxy,

              vielen lieben Dank!
              Dein "Edit-Tipp" war die Lösung. Und wieder ist man schlauer.
              Nun muss ich mich nur noch ransetzen, eine Lösung für den Intervall "Nachtschicht" finden. Wenn nicht, melde ich mich morgen in diesem Thread nochmal.

              Danke euch beiden & schönen Feierabend,
              Michael

              Kommentar


              • #8
                Guten Morgen in die Runde,

                wie gestern schon erwähnt, melde ich mich doch wegen dem "Nachtschicht"-Problem.

                So sieht meine Testabfrage aus (Bsp. Abfrage von Nachtschicht Maschine m01 - Zeitraum: 2014-07-15 bis 2014-07-18 ) :
                Code:
                SELECT * FROM auftrag
                LEFT JOIN m01 on auftrag.wanr = m01.wanr 
                WHERE (Datum BETWEEN '2014-07-15 00:00:00'  AND '2014-07-18 23:59:59') 
                AND HOUR(Datum) >= '22' AND HOUR(Datum) <= '24' 
                AND (Datum BETWEEN '2014-07-15 00:00:00'  AND '2014-07-18 23:59:59') 
                AND HOUR(Datum) >= '00' AND HOUR(Datum) <= '06'
                AND Maschine = 'm01'
                Leider ohne Ausgabe.
                Hätte jemand eine Idee, wie man den Intervall für die Nachschicht (22 bis 6 Uhr) einstellt?
                Hinzu kommt die Schwierigkeit, das man der Abfrage mitgeben müsste, das die Nachtschicht vom 18.07. erst am 19.07. um 6 Uhr endet.

                Ich hoffe, es ist einigermaßen verständlich beschrieben.

                Vielen Dank im Voraus und Gruß,
                Michael

                Kommentar


                • #9
                  Wie gesagt, ich bin alles andere als ein DB-Experte:

                  Code:
                  SELECT * FROM auftrag
                  LEFT JOIN m01 on auftrag.wanr = m01.wanr 
                  WHERE (Datum BETWEEN '2014-07-15 00:00:00'  AND '2014-07-18 23:59:59') 
                  AND ((HOUR(Datum) BETWEEN '22' AND '24') OR (HOUR(Datum) BETWEEN '00' AND '06'))
                  AND Maschine = 'm01'
                  hast du geprüft, ob HOUR() auch tatsächlich die Stunde mit führender "0" zurückgibt?

                  Edit: Wenn du deine Bedingung mal durch ließt wirst du merken, dass diese nie wahr sein kann. Es gibt eifnach keinen Zeitpunkt, der sowohl zwische 22 und 24 alsauch zwischen 0 und 6 Uhr liegt Deshalb: OR

                  Kommentar


                  • #10
                    AND HOUR(Datum) >= '22' AND HOUR(Datum) <= '24'
                    AND HOUR(Datum) >= '00' AND HOUR(Datum) <= '06'
                    Eine Uhrzeit kann nicht gleichzeitig in zwei Bereichen liegen, die sich nicht überschneiden.

                    Probiers mal mit OR
                    Code:
                    WHERE 
                    Datum BETWEEN '2014-07-15 00:00:00'  AND '2014-07-18 23:59:59' 
                    AND (
                        HOUR(Datum) >= '22' AND HOUR(Datum) <= '24' 
                      OR
                        HOUR(Datum) >= '00' AND HOUR(Datum) <= '06'
                    )
                    AND Maschine = 'm01'
                    edit: alxy war schneller
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Danke für eure schnelle Reaktion.

                      Leider ist eure Lösung nur ein Teilerfolg.
                      Problem sind die Anfangs- und Endtage. Sprich am 15.07. soll nur von 22 bis 0 Uhr ausgeben werden, dann übernimmt ja der 16.07. Allerdings wird mit der jetzigen Version auch der Zeitraum 0 bis 6 Uhr vom 15.07. ausgeben - was falsch ist, da dieser Intervall zur Nachtschicht 14.07. gehört.

                      Das selbe Problem für den 18.07.
                      Dort muss wiederum bis 6 Uhr am 19.07. die gewünschten Spalten ausgegeben werden.

                      Komplizierte Sache, aber kann man diese Fälle mit einbauen? :/

                      Lieben Gruß und vielen Dank,
                      Michael

                      Kommentar


                      • #12
                        Zitat von MichaPHP Beitrag anzeigen
                        Danke für eure schnelle Reaktion.

                        Leider ist eure Lösung nur ein Teilerfolg.
                        Problem sind die Anfangs- und Endtage. Sprich am 15.07. soll nur von 22 bis 0 Uhr ausgeben werden, dann übernimmt ja der 16.07. Allerdings wird mit der jetzigen Version auch der Zeitraum 0 bis 6 Uhr vom 15.07. ausgeben - was falsch ist, da dieser Intervall zur Nachtschicht 14.07. gehört.

                        Das selbe Problem für den 18.07.
                        Dort muss wiederum bis 6 Uhr am 19.07. die gewünschten Spalten ausgegeben werden.

                        Komplizierte Sache, aber kann man diese Fälle mit einbauen? :/

                        Lieben Gruß und vielen Dank,
                        Michael
                        Rate mal, wie du diese Zeile dafür anpassen müsstest:

                        Code:
                        Datum BETWEEN '2014-07-15 00:00:00'  AND '2014-07-18 23:59:59'
                        Ist nicht allzu schwierig

                        Kommentar


                        • #13
                          Okay, habe es jetzt folgendermaßen gelöst:

                          Code:
                          WHERE (Datum BETWEEN '2014-07-15 22:00:00'  AND '2014-07-19 06:59:59' )
                          Dabei wird das Datum 2014-07-19 aus 2014-07-18 vorher per "trim" gebildet.
                          Damit stimmen nun meine Abfragen.

                          Danke dir alxy!

                          Gruß,
                          Michael

                          Kommentar

                          Lädt...
                          X