Ich bin auf der Suche nach einen Zeitraum mit einem Wert in einzelne Tage mit entsprechendem Teilwert aufzuteilen. Ich habe bspw. eine Tabelle wie folgt, das Ergebnis sollte ungefähr aussehen, wie in der zweiten Tabelle:
Ich habe es bisher nur geschafft, den Zeitraum in drei einzelne Zeilen aufzuteilen, allerdings mit jeweils einem Drittel des Wertes (6480 / 3).
Hat damit jemand Erfahrung? Der Hintergrund ist, dass ich in einer anderen Tabelle einen Wert „verfügbaren Zeitraum pro Tag“ habe, den ich dann hiermit zusammen bringen will.
Wie genau willst Du das denn zusammenbringen? Willst Du wissen wieviel der angegebenen Zeitspanne in den “Zeitraum pro Tag” fällt? Wie genau ist “Zeitraum pro Tag” definiert? Wenn das auch wieder zwei Timestamp sind, dann könntest Du das z.B. mittels Range Datentype berechnen:
Angenommen der zweite Datensatz in der ersten Tabelle wäre
Start: 2022-05-09 14:00
Ende: 2022-05-12 06:00
Dann hätte ich am 9.5.22 eine Dauer von 600 Minuten. Zusammen mit den aus der ID 1 (720) dann 1320. Aus der andern Tabelle kommt dann ein verfügbarer Zeitraum von bspw. 1440, somit „freie Zeit“ von 120 Minuten. Der Teil soll dann aber in einem Reportingsystem laufen, nicht auf der DB.
Also das “Zerlegen” geht schon, auch wenn es nicht schön ist:
select t.id,
case
when t."start"::date = x.dt::date then t."start"
else date_trunc('day', x.dt)
end as "start",
case
when t."end"::date = x.dt::date then t."end"
else (x.dt::date + 1)::timestamp
end as "end"
from the_table t
cross join generate_series(t.start, t.end, interval '1 day') as x(dt)
order by t.id, "start"
eins ist mir noch aufgefallen. Das Ganze funktioniert immer dann nicht, wenn das “end” zwar an einem darauffolgenden Tag aber zeitlich vor dem Start liegt, also bspw:
Start: 2022-05-08 04:00
End: 2022-05-12 03:30
Das führt dann dazu, dass der letzte Tag nicht mehr angezeigt wird: