Auswertung mit Abgrenzung über Datum

VolkerS.

Neuer Benutzer
Beiträge
3
Guten Morgen,

irgendwie stehe ich gerade auf dem Schlauch und mir fehlt einfach die passende Idee. Diese Abfrage ist nur ein Teil einer Abfrage (später sollen diese Werte mit dem Ergebniss aus einer weiteren Tabelle verrechnet werden).
In der Tabelle werden Zeiten abgespeichert wann etwas eingeschaltet war.

Zur Tabelle (vereinfacht):

Beginn (datetime) | Ende (datetime)


Nun möchte ich wissen, wie lange war etwas an einem Tag eingeschaltet.
Dabei kann es
a) an einem Tag mehrere Einträge geben - das lässt sich über die sum-Funktion lösen
b) Zeiten geben, die von einem Tag bis zum nächsten gehen.

Gerade die Abgrenzung der Tagesgrenzen bereitet mir hier die größten Probleme.

Bin daher für jeden Lösungsansatz sehr dankbar.

mfg

Volker
 
Werbung:
Du kannst mit Datumswerten rechnen, also die Datenbank kann das. Und sie kann dabei Schaltjahre und all den ganzen Kram berücksichtigen.

SELECT HOUR(TIMEDIFF(a,b)) ..
 
Leider bringt mich das so nicht weiter. Nehmen wir an es stehen folgende Werte in der Tabelle:

Beginn | Ende
2021-04-12 14:00:00 | 2021-04-12 16:00:00
2021-04-12 22:00:00 | 2021-04-13 05:00:00

Habe jetzt folgende Abfrage erstellt:

SELECT sum(Timediff(Ende, Beginn))
FROM tabelle
GROUP BY date(Beginn)

Als Ergebnis werden mir 9 Stunden geliefert. Jedoch brauche ich als Ergebnis

2021-04-12 4 Stunden
2021-04-13 5 Stunden


mfg

Volker
 
Tja, dazu erst einmal aufdröseln, wieviel Zeit je Tag da anfällt. Generell bieten sich für solche Dinge diverse Tools wie Timestamprange, LATERAL JOIN und generate_series() an - von denen MySQL nicht kann.

Code:
test=*# with x as (select * from volker_s left join lateral (select * from generate_series(lower(start_end)::date, upper(start_end)::date,'1day'::interval)g) s on (true)) select start_end, g as date, start_end * tsrange(g::date,g::date+1) as time_on_this_date from x;
                   start_end                   |          date          |               time_on_this_date               
-----------------------------------------------+------------------------+-----------------------------------------------
 ["2021-04-12 14:00:00","2021-04-12 16:00:00") | 2021-04-12 00:00:00+02 | ["2021-04-12 14:00:00","2021-04-12 16:00:00")
 ["2021-04-12 22:00:00","2021-04-13 05:00:00") | 2021-04-12 00:00:00+02 | ["2021-04-12 22:00:00","2021-04-13 00:00:00")
 ["2021-04-12 22:00:00","2021-04-13 05:00:00") | 2021-04-13 00:00:00+02 | ["2021-04-13 00:00:00","2021-04-13 05:00:00")
(3 rows)

alles zusammen:

Code:
test=*# with x as (select * from volker_s left join lateral (select * from generate_series(lower(start_end)::date, upper(start_end)::date,'1day'::interval)g) s on (true)), y as( select start_end, g as date, start_end * tsrange(g::date,g::date+1) as time_on_this_date from x) select date, sum (upper(time_on_this_date)-lower(time_on_this_date)) from y group by date order by date;
          date          |   sum   
------------------------+----------
 2021-04-12 00:00:00+02 | 04:00:00
 2021-04-13 00:00:00+02 | 05:00:00
(2 rows)

test=*#

Um die Abfrage zu vereinfachen, habe ich CTE's verwendet - kann MySQL aber auch nicht.
 
Werbung:
Zurück
Oben