sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan returnerer man kun arbejdstid fra reservationer i PostgreSql?

Du kan bruge funktionen gener_series() for at maskere ikke-åbningstider:

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

Lad mig forklare nogle vanskelige dele:

  • du behøver ikke at indsætte datoer for lør/søn i pyha tabel, fordi du kan bruge date_part('dow', d) fungere. Brug pyha bord kun til helligdage. 'dow' returnerer 0 eller 6 for henholdsvis søn eller lør.
  • helligdage og lør/søn kan repræsenteres som enkelt interval (0..24). Ugedage skal repræsenteres af to intervaller (0..8) og (18..24), derfor unnest() og array[]
  • du kan angive startdato og længde i funktionen gener_series()

Baseret på din opdatering af spørgsmålet tilføjede jeg endnu en when til case :

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

Ideen er at producere forskellige intervaller for startdatoen (d::date = '2012-11-14' ):(0..9) og (18..24)




  1. Sådan genererer du indsæt-sætninger fra tekstfiler til SQL Server-tabel i SQL Server - SQL Server / TSQL Tutorial Del 106

  2. Indstil tomme strenge ('') til NULL i hele databasen

  3. Optimer PostgreSQL til hurtig test

  4. Sådan analyseres aktiviteten af ​​en database i SQL Server