Announcement

Collapse
No announcement yet.

Datum in Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datum in Abfrage

    Hallo,

    ich habe in einer Tabelle olt zwei DateTime-Feld mit Namen start und end und ein Feld Termin. Dort habe ich zum Beispiel folgende Einträge drin:

    Start, End, Termin
    2008-06-17 00:00:00, 2008-06-17 00:20:00, Test1
    2008-06-17 12:00:00, 2008-06-19 12:20:00, Test2
    2008-06-20 00:00:00, 2008-06-20 12:00:00, Test3

    Jetzt möchte ich wissen an wievielen Tagen im Jahr ich Termine habe. Ein einfaches Count funktioniert nicht, da sich die Termine überschneiden können. Ich aber nicht die Anzahl der Termine sondern die Anzahl der Tage im Jahr mit Termin benötige. Ergebnis auf obigen Datenbestand müsste 4 Sein 17 (17 nicht doppelt zählen!), 18, 19, 20.

    Hat jemand eine Idee wie ich das mittels einer Abfrage auslesen kann?

    Danke

  • #2
    Hi,

    erstmal nur für ein Datum. Es lässt sich aber garantiert erweitern. Zuerst frage ich in einer Unterabfrage alle Daten ab und Gruppiere sie nach dem Datum, sodass doppelte entfernt werden. Schließlich zähle ich die zurückgegebenen Werte aus dem Subselect.

    [highlight=sql]
    SELECT count(Date(A.`date`))
    FROM (
    SELECT Date(`date`) as `date`
    FROM `testdatetime`
    GROUP BY Date(`date`)) AS A
    [/highlight]
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Es geht sogar noch einfacher mit distinct:

      [highlight=sql]
      SELECT count(distinct(Date(`date`)))
      FROM `testdatetime`
      [/highlight]
      "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

      Viele Grüße Novi

      Comment


      • #4
        Aber das Problem bei distinct bzw. beiden Count Lösungen ist doch folgendes:

        start: 17.10. ende: 19.10.
        start: 18.10. ende: 18.10.

        Würde bei beiden Lösungen eine 2 ergeben, richtig wäre jedoch eine 3: 17, 18, 19

        Comment


        • #5
          Hallo,

          das Problem lässt sich sicher nicht mit einer einfachen Gruppierung oder einem Distinct lösen, da ja offensichtlich auch die Tage berücksichtigt werden müssen, die nicht explizit aufgeführt sind, sondern nur implizit durch den Zeitraum VON BIS gegeben sind.
          Ich behaupte mal das sich das nicht mit einem SQL-Select lösen läßt. Hier ist weitergehende Logik in einer SP oder Applikation notwendig.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Danke,

            ich habe da glaub ich schon eine Idee. Kann mir zufällig jemand sagen wie ich aus dem DateTime Feld den Tag des Jahres (z.B. Datum x = Tag 245) bekomme?

            Comment


            • #7
              Originally posted by Maik20 View Post
              Danke,

              ich habe da glaub ich schon eine Idee. Kann mir zufällig jemand sagen wie ich aus dem DateTime Feld den Tag des Jahres (z.B. Datum x = Tag 245) bekomme?
              Siehe: Date and Time Functions - DAYOFYEAR(date)

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Originally posted by Falk Prüfer View Post
                Ich behaupte mal das sich das nicht mit einem SQL-Select lösen läßt.
                Es geht schon. Nur nicht wirklich elegant, aber vielleicht kann man meinen Ansatz ja verbesssern. Funktionieren tut es für kleine Bereiche! Eine gute Lösung ist natürlich was anderes, aber ich wollte es einfach hinkriegen.

                [highlight=sql]
                SELECT count( * )
                FROM (

                SELECT DATE_ADD( `start` , INTERVAL 0
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 0
                DAY ) <= `end`
                UNION
                SELECT DATE_ADD( `start` , INTERVAL 1
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 1
                DAY ) <= `end`
                UNION
                SELECT DATE_ADD( `start` , INTERVAL 2
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 2
                DAY ) <= `end`
                UNION
                SELECT DATE_ADD( `start` , INTERVAL 3
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 3
                DAY ) <= `end`
                UNION
                SELECT DATE_ADD( `start` , INTERVAL 4
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 4
                DAY ) <= `end`
                UNION
                SELECT DATE_ADD( `start` , INTERVAL 5
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 5
                DAY ) <= `end`
                UNION
                SELECT DATE_ADD( `start` , INTERVAL 6
                DAY )
                FROM `dateintervall`
                WHERE DATE_ADD( `start` , INTERVAL 6
                DAY ) <= `end`
                )A
                [/highlight]

                Pro Tag eine Unterabfrage zu haben, ist natürlich eher suboptimal. Kann man Schleifen in SQL eigentlich auch in einem normalen Query verwenden?
                "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

                Viele Grüße Novi

                Comment


                • #9
                  Originally posted by Novi View Post
                  Es geht schon. Nur nicht wirklich elegant, ...
                  Und nicht alles was geht ist wirklich sinnvoll
                  Also ich persönlich würde da eine SP- oder Applikationslösung vorziehen...

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment

                  Working...
                  X