Wert pro Zeitraum in Wert pro Tag splitten

Hallo zusammen,

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.

Die Posgres Version ist 14.2.

Danke!

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:

tsrange('2022-05-07 06:00', '2022-05-09 12:00') * tsrange('2022-05-07 08:30', '2022-05-07 17:45')

Das rechte Argument wäre der “Zeitrum pro Tag”. Das Ergebnis ist wieder ein Range der angibt wo sich die beiden überschneiden.

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.

Gruß

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"  

Online Beispiel

1 „Gefällt mir“

Perfekt, genau das wonach ich gesucht habe.

Vielen Dank!

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:

|2|2022-05-08 04:00:00|2022-05-09 00:00:00|
|2|2022-05-09 00:00:00|2022-05-10 00:00:00|
|2|2022-05-10 00:00:00|2022-05-11 00:00:00|
|2|2022-05-11 00:00:00|2022-05-12 00:00:00|

Richtig wäre ja aber eine 5. Zeile mit

|2|2022-05-12 00:00:00|2022-05-12 03:30:00|

Beispiel basierend auf deinem

Gibt es dafür noch eine Lösung?