您可以使用generate_series()函数来掩盖非工作时间:
with gaps as ( select upper(during) as start, lead(lower(during),1,upper(during)) over (ORDER BY during) - upper(during) as gap from ( select during from reservation union all select unnest(case when pyha is not null then array[tsrange(d, d + interval '1 day')] when date_part('dow', d) in (0, 6) then array[tsrange(d, d + interval '1 day')] when d::date = '2012-11-14' then array[tsrange(d, d + interval '9 hours'), tsrange(d + interval '18 hours', d + interval '1 day')] else array[tsrange(d, d + interval '8 hours'), tsrange(d + interval '18 hours', d + interval '1 day')] end) from generate_series( '2012-11-14'::timestamp without time zone, '2012-11-14'::timestamp without time zone + interval '2 week', interval '1 day' ) as s(d) left join pyha on pyha = d::date ) as x )select * from gapswhere gap > '0'::intervalorder by start
让我解释一些棘手的部分:
- 您不必在表中插入星期六/日的日期,
pyha
因为您可以使用date_part('dow', d)
功能。pyha
仅在公共假期使用表。’dow’对于Sun或Sat分别返回0或6。 - 公共假期和周六/周日可以表示为单个间隔(0..24)。工作日必须用两个间隔(0..8)和(18..24)表示,因此unnest()和array []
- 您可以在generate_series()函数中指定开始日期和长度
根据您的更新,我添加了另一个问题
when来
case:
when d::date = '2012-11-14' then array[tsrange(d, d + interval '9 hours'), tsrange(d + interval '18 hours', d + interval '1 day')]
这个想法是为开始日期(
d::date = '2012-11-14')产生不同的时间间隔:(0..9)和(18..24)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)