sql >> Databáze >  >> RDS >> PostgreSQL

Jak vrátit pouze pracovní čas z rezervací v PostgreSql?

K maskování mimo pracovní dobu můžete použít funkci create_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 gaps
where gap > '0'::interval
order by start

Dovolte mi vysvětlit některé záludné části:

  • nemusíte vkládat data sobota/neděle do pyha tabulku, protože můžete použít date_part('dow', d) funkce. Použijte pyha stůl pouze pro státní svátky. 'dow' vrátí 0 nebo 6 pro Ne nebo So.
  • státní svátky a sobota/neděle mohou být reprezentovány jako jeden interval (0..24). Pracovní dny musí být reprezentovány dvěma intervaly (0..8) a (18..24), proto unnest() a array[]
  • ve funkci generation_series() můžete zadat počáteční datum a délku

Na základě vaší aktualizace otázky jsem přidal další when na case :

when d::date = '2012-11-14' then array[tsrange(d, d + interval '9 hours'), tsrange(d + interval '18 hours', d + interval '1 day')]

Cílem je vytvořit různé intervaly pro počáteční datum (d::date = '2012-11-14' ):(0..9) a (18..24)




  1. SQL :v klauzuli v uložené proceduře:jak předávat hodnoty

  2. Převést „datetimeoffset“ na „čas“ v SQL Server (příklady T-SQL)

  3. Database-Aware Load Balancing:Jak migrovat z HAProxy na ProxySQL

  4. Jak mohu optimalizovat funkci ORDER BY RAND() MySQL?