Announcement

Collapse
No announcement yet.

Gruppierung von Zeiteinheiten

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

  • Gruppierung von Zeiteinheiten

    Hallo,

    ich habe eine ziemlich knifflige Abfrage und ich dachte, dass ich hier möglicherweise eine Antwort finden könnte. Es geht darum, dass ich die Anzahl von Terminen rausbekommen möchte, welche innerhalb von bestimmten Zeiträumen aktiv sind.

    Also z.B:

    Code:
    Termin	Beginn	Ende
    T1	06:15	07:45
    T2	07:10	08:15
    Als Ergebnis hätte ich gerne (gruppiert nach halben Stunden) folgendes Ergebnis:

    Code:
    Zeitpunkt Anzahl
    05:30	0
    06:00	1
    06:30	1
    07:00	2
    07:30	2
    08:00	1
    08:30	0
    Also bei wievielen Terminen liegt der Zeitpunkt zwischen Beginn und Ende. Also um 07:30 sind sowhol T1 als auch T2 noch aktiv.

    Ich müsst irgendwie über alle möglichen (halben) Stunden eines Tages iterieren und überprüfen ob dieser Wert BETWEEN BEGINN und ENDE liegt. So war meine Idee. Habt ihr möglicherweise einen besseren Lösungsansatz für mich?

    danke

  • #2
    Hallo,
    Originally posted by maro View Post
    ...Habt ihr möglicherweise einen besseren Lösungsansatz für mich?
    Benutze die Datums-/Zeitfunktionen deines DBMS und formatiere/runde die Zeiten auf halbe Stunden. Danach kannst du dann gruppieren und die Aggregatfunktion COUNT() benutzen.

    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


    • #3
      Bei Oracle 8 geht das so:
      Code:
      SELECT to_char(to_date(to_char(sysdate,'dd.mm.yy'),'dd.mm.yy')+0.020833333*z.id,'dd.mm.yy hh24:mi'),count(h1.id) anzahl 
      FROM zahlen z,h1 
      WHERE to_date(to_char(sysdate,'dd.mm.yy'),'dd.mm.yy')+0.020833333*z.id between h1.beginn(+) and h1.ende(+) and z.id<49 
      GROUP BY 0.020833333*z.id
      Die Tabelle Zahlen ist eine Hilfstabelle, die ich öfter für ähnliche Zwecke brauche. Sie enthält ganze Zahlen von 0 bis einige 100000.
      Die Tabelle h1 ist folgendermaßen erstellt:
      Code:
      create table h1 (id number,beginn date,ende date)
      Das Ganze arbeitet datumsübergreifend. Ich habe es getestet.
      Bei MySql sieht das sicher etwas anders aus.
      0.020833333 ist der 48-ste Teil eines Tages. Bei Oracle werden die Tage gezählt und nicht die Sekunden wie bei MySql. Das (+) bewirkt bei Oracle einen Left Join, damit auch die Nullen angezeigt werden.
      Wenn es nur immer für einen Tag sein soll, kannst du die Query noch vereinfachen. Ich habe dafür eine Tabelle h2 aufgestellt, in der für Stunden und Minuten Number-Felder verwendet werden, weil es bei Oracle 8 kein Time-Format gibt:
      Code:
      create table h2 (id number,beginn_std number,beginn_min number,ende_std number,ende_min number)
      Die Query lautet:
      Code:
      SELECT to_char(floor(z.id/2),'00')||':'||to_char(mod(z.id,2)*30,'00'),count(h2.id) anzahl 
      FROM zahlen z,h2 where z.id between h2.beginn_std(+)*2+h2.beginn_min(+)/30 AND h2.ende_std(+)*2+h2.ende_min(+)/30 AND z.id<49 
      GROUP BY z.id
      Zuletzt editiert von Wiedehopf; 17.06.2009, 14:49.

      Comment


      • #4
        danke für die Lösungsansätze!

        Ich werde mal versuchen das Ganze auf MSSQL zu mappen und wenn möglich ohne Zahlen-Tabelle.

        Comment

        Working...
        X