PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zwrócić tylko czas pracy z rezerwacji w PostgreSql?

Możesz użyć funkcji generate_series() w celu zamaskowania godzin innych niż godziny pracy:

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

Pozwólcie, że wyjaśnię kilka trudnych części:

  • nie musisz wstawiać dat sob/niedz do pyha tabeli, ponieważ możesz użyć date_part('dow', d) funkcjonować. Użyj pyha stół tylko na święta. „dow” zwraca 0 lub 6 odpowiednio dla niedzieli lub soboty.
  • Święta państwowe i sob/niedz mogą być reprezentowane jako pojedynczy przedział (0..24). Dni tygodnia muszą być reprezentowane przez dwa przedziały (0..8) i (18..24), stąd unnest() i array[]
  • możesz określić datę rozpoczęcia i długość w funkcji generate_series()

Na podstawie Twojej aktualizacji pytania dodałem kolejne when do case :

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

Pomysł polega na stworzeniu różnych interwałów dla daty rozpoczęcia (d::date = '2012-11-14' ):(0..9) i (18..24)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Granice wyrazów PostgreSQL Regex?

  2. PostgreSQL UTWÓRZ TABELĘ

  3. Jak Cosh() działa w PostgreSQL

  4. GroupingError:ERROR:kolumna musi występować w klauzuli GROUP BY lub być używana w funkcji agregującej

  5. Ograniczenie wyzwalania a sprawdzanie