Nur Datensätze anzeigen, wenn heute zwischen zwei angegebenen Daten liegt

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

  • Nur Datensätze anzeigen, wenn heute zwischen zwei angegebenen Daten liegt

    Hallo,

    ich habe eine MySQL-Tabelle, mit u.a. zwei Feldern 'date_start' und 'date_end' des Typs INT, darin steht der Timestamp. Beide Felder stellen einen Datumsbereich dar, also z.B. 15.02.-05.03.

    Nun möchte ich alle Datensätze auslesen, bei denen heute (also 21.02.) in diesem Datumsbereich liegt. Das Jahr spielt darin keine Rolle, da es sich um wiederkehrende Ereignisse handeln soll.

    Ich habe schon vieles probiert, aber irgendwie klappt es nicht.
    PHP-Code:
    $sql "SELECT * FROM daten WHERE (DAY(FROM_UNIXTIME(date_start)) BETWEEN " date('d') . 
    AND DAY(FROM_UNIXTIME(date_start)) AND MONTH(FROM_UNIXTIME(date_start)) BETWEEN " 
    date('m') . 
    AND MONTH(FROM_UNIXTIME(date_start))) AND (DAY(FROM_UNIXTIME(date_end)) BETWEEN " 
    date('d') . " AND DAY(FROM_UNIXTIME(date_end)) 
    AND MONTH(FROM_UNIXTIME(date_end)) BETWEEN " 
    date('m') . " AND MONTH(FROM_UNIXTIME(date_end)))" 
    Würde mich daher über Hilfe freuen, oder zumindest eine Anregung.

    Viele Grüße

  • #2
    du denkst zu kompliziert :-)

    Code:
    SELECT 
        bla 
    FROM 
        blubb 
    WHERE 
        start < aktueller-timestamp 
    AND 
        end > aktueller-timestamp
    den "aktueller-timestamp" ermittelst du zb. mit mktime().
    Kissolino.com

    Kommentar


    • #3
      Hallo Wurzel,

      leider ist es ganz so einfach nicht. Denn das Jahr spielt im Timetamp keine Rolle, daher muss ich mit DAY und MONTH arbeiten. Es handelt sich um wiederkehrende Ereignisse.

      Zum zweiten stellt mich die DAY()-Abfrage vor ein Problem. Denn angenommen, das Startdatum sei "31.12.", das Enddatum der "27.02.". Heute ist der "21.02". Der "21." liegt nicht zwischen dem "31." und "27.", wohl aber zwischen den beiden Daten (den Monat berücksichtigend). Daher kann ich BETWEEN nicht verwenden, oder?

      Kommentar


      • #4
        Wenn du das Jahr nicht berücksichtigst liegt ein Datum immer zwischen zwei anderen:

        01.03 - 01.05
        oder
        01.05 - 01.03

        Du solltest erstmal genau spezifizieren was du suchst, und dann deinen Query entsprechend bauen.

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Original geschrieben von DerUnsympath
          Denn das Jahr spielt im Timetamp keine Rolle, daher muss ich mit DAY und MONTH arbeiten.
          nein, musst du nicht, denn der timestamp für den 27.2. ist 2006 derselbe
          wie 2009 oder 1998.

          die frage ist ja, wie weit die start-/end-daten auseinander liegen. du
          musst dir halt überlegen, wann das ganze vom jeweiligen zeitpunkt
          aus kippt und das in der zusammenstellung der query berücksichtigen.

          schau dir mal den timestamp für den 01.01. und den 31.12. an. wo
          verläuft die grenze, wenn dein bereich den 15.12. bis zum 15.01.
          umfasst? und wie kannst du die ermitteln?

          wenn ich jetzt nicht völlig verplant bin, gibt es nur die wahl zwischen
          dem pseudo-code oben und einer alternativen abfrage mit einem OR
          sobald ein bestimmtes ereignis eintritt.

          PS: der haken der ganzen geschichte mit der timestamp-rechnerei
          könnte der 29.02. sein.
          Kissolino.com

          Kommentar


          • #6
            Für alle, die es interessiert, hier die Lösung:
            PHP-Code:
            SELECT FROM daten
            WHERE
               
            (DATE_FORMAT(NOW(), "%m%d"BETWEEN
                  DATE_FORMAT
            (FROM_UNIXTIME(date_start), "%m%d") AND
                  
            DATE_FORMAT(FROM_UNIXTIME(date_end), "%m%d"))
            OR (
            DATE_FORMAT(FROM_UNIXTIME(date_end), "%m%d"BETWEEN
                  DATE_FORMAT
            (NOW(), "%m%d") AND
                  
            DATE_FORMAT(FROM_UNIXTIME(date_start) - INTERVAL 1 DAY"%m%d"))
            OR (
            DATE_FORMAT(FROM_UNIXTIME(date_start), "%m%d"BETWEEN
                  DATE_FORMAT
            (FROM_UNIXTIME(date_end) + INTERVAL 1 DAY"%m%d") AND
                  
            DATE_FORMAT(NOW(), "%m%d")) 
            Weiß nicht, ob's da Optimierungsmöglichkeiten gibt, aber es läuft.

            Kommentar


            • #7
              ... WHERE ((heute BETWEEN start AND end) AND start <= end) OR (end < heute AND heute < start)

              Kommentar


              • #8
                Original geschrieben von onemorenerd
                ... WHERE ((heute BETWEEN start AND end) AND start <= end) OR (end < heute AND heute < start)
                Das berücksichtigt aber das Jahr. Das möchte ich ja nicht, da es sich um wiederkehrende Ereignisse handelt.

                Kommentar


                • #9
                  Das ist Pseudo-SQL. Ich wollte nicht diese langen DATE_FORMATs schreiben. Es funktioniert ohne Jahr.
                  Bei deiner Query bin ich mir nicht sicher, ob sie korrekt ist. Vermutlich nicht. Davon abgesehen ist sie komplizierter, daher sicher auch langsamer.

                  Kommentar


                  • #10
                    Hi,

                    Original geschrieben von ghostgambler
                    Wenn du das Jahr nicht berücksichtigst liegt ein Datum immer zwischen zwei anderen:

                    01.03 - 01.05
                    oder
                    01.05 - 01.03
                    ich denke, dadurch, dass festegelgt ist, welches das Start- und welches das Enddatum sein soll, ist die Eindeutigkeit schon gegeben.


                    Original geschrieben von ghostgambler
                    ... WHERE ((heute BETWEEN start AND end) AND start <= end) OR (end < heute AND heute < start)
                    Hmm, beim ersten Teil ist "AND start <= end" eigentlich überflüssig, oder nicht?
                    Der zweite Teil matcht eher auf Termine, die nicht im Zeitraum liegen:

                    start = 1.12, end = 10.2., heute = 22.02:

                    0210 < 0222 < 1201

                    Original geschrieben von ghostgambler
                    Bei deiner Query bin ich mir nicht sicher, ob sie korrekt ist. Vermutlich nicht.
                    Müsste eigentlich korrekt sein. Die Logik sieht so aus:
                    Für ein Datum, dass innerhalb eines Zeitraumes liegt, gibt's 3 Fälle:

                    1. Start, heute und Ende liegen im selben Jahr (der einfachste Fall): => start <= heute <= end
                    2. Zwischen heute und Ende liegt ein Jahreswechsel: => end < start <= heute
                    3. Zwischen Start und heute liegt ein Jahreswechsel: => heute <= end < start

                    Genau das bildet die Abfrage ab.

                    LG

                    Kommentar


                    • #11
                      falls Du mit mysql arbeites würde ich das mit der Funktion dayofyear loesen.
                      also dayofyear(dat) between dayofyear(dat1) and dayofyear(dat2)
                      Beantworte nie Threads mit mehr als 15 followups...
                      Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                      Kommentar


                      • #12
                        Hi,

                        das würde aber jahresübergreifend nicht funktionieren. Ich wüsste keinen Weg, wie er um die 3 Fälle herumkommen soll.

                        LG

                        Kommentar

                        Lädt...
                        X