Вы можете использовать рекурсивный CTE как в SQL Server, так и в Postgres, но синтаксис немного отличается.И есть более простой метод в Postgres.Итак, в SQL Server вы можете сделать:
with cte as (
select username, startdate, weekday, enddate
from t
union all
select username, dateadd(day, 1, startdate) weekday, enddate
from cte
where startdate < enddate
)
select username, startdate, weekday
from cte
order by username, startdate;
Вы можете настроить арифметику даты и добавить ключевое слово recursive
для Postgres.
Более простой метод в Postgres - это боковое соединение:
select t.username, g.startdate, t.weekday
from t, lateral
generate_series(start_date, end_date, interval '1 day') g(startdate);
Если вам нужен один и тот же код для работы с обоими, вам нужно сгенерировать таблицу чисел.Вот один (неприятный) метод:
with digits as (
select v.n
from (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v(n)
),
n as (
select d1.n * 100 + d2.n * 10 + d3.n as n
from digits d1 cross join digits d2 cross join digits d3
)
select t.username, t.startdate + n.n, t.weekday
from t join
n
on t.startdate + n.n <= t.enddate;
Обратите внимание, что для этого startdate
должен быть datetime
в SQL Server, но date
в Postgres.