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

  • MichaPHP
    hat ein Thema erstellt [Erledigt] Letzter Tag vom Datumsintervall fehlt.

    [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

  • MichaPHP
    antwortet
    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

    Einen Kommentar schreiben:


  • alxy
    antwortet
    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

    Einen Kommentar schreiben:


  • MichaPHP
    antwortet
    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

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    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

    Einen Kommentar schreiben:


  • alxy
    antwortet
    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

    Einen Kommentar schreiben:


  • MichaPHP
    antwortet
    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

    Einen Kommentar schreiben:


  • MichaPHP
    antwortet
    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

    Einen Kommentar schreiben:


  • alxy
    antwortet
    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')

    Einen Kommentar schreiben:


  • MichaPHP
    antwortet
    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'

    Einen Kommentar schreiben:


  • wolf29
    antwortet
    Hi,

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

    mfg Wolf29

    Einen Kommentar schreiben:


  • MichaPHP
    antwortet
    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

    Einen Kommentar schreiben:


  • wolf29
    antwortet
    Hi,

    Zeig mal bitte deine Tabellenstruktur.

    mfg Wolf29

    Einen Kommentar schreiben:

Lädt...
X