Redshift имеет одну болезненную «особенность». Создавать производную таблицу очень сложно. Позвольте мне предположить, что у вас есть таблица, достаточно большая, чтобы сгенерировать таблицу подсчета или чисел.
Тогда, остальное - арифметика даты c. , , но немного сложнее. У меня нет Redshift под рукой - и у него странная комбинация синтаксиса даты с SQL Server и Postgres
with numbers as (
select row_number() over () - 1 as n
from t
)
select t.id,
greatest(date_trunc('day', t.fromdate) + n.n * interval '1 day', t.fromdate) as fromdate,
least(date_trunc('day', t.fromdate) + (n.n + 1) * interval '1 day', t.todate) as todate
datediff(hour,
greatest(date_trunc('day', t.fromdate) + n.n * interval '1 day', t.fromdate),
least(date_trunc('day', t.fromdate) + (n.n + 1) * interval '1 day', todate)
) as hours
from t join
numbers n
on todate > date_trunc('day', t.fromdate) + n.n * interval '1 day';
Здесь - это db <> скрипка используя Postgres, который иллюстрирует основные идеи, стоящие за этим.