• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PostgreSQL - zwróć obiekt jeśli jest aktualnie otwarty

Object Storage Arubacloud
0 głosów
57 wizyt
pytanie zadane 24 stycznia w SQL, bazy danych przez Wojciech65 Nowicjusz (150 p.)

Hej, mam problem ze swoją metodą, która filtruje rekordy z tabeli,

Założenie jest takie, aby zwracać tylko te obiekty, które aktualnie są otwarte, jeżeli metoda otrzymat parametr open_now = true,

Mój kod wygląda w ten sposób (Jestem początkujący i jeżeli macie jakieś zalecenia co do poprawienia bardzo chętnie wysłucham):

CREATE OR REPLACE FUNCTION method_name(
  ...
  open_now boolean DEFAULT FALSE,
)
RETURNS TABLE (
  id public.table_name_with_objects_list.id%TYPE, 
  ...
  timezone_place public.table_name_with_objects_list.timezone_place%TYPE
)
LANGUAGE sql
AS $$
  SELECT r.id, r.timezone_place
  FROM public.table_name_with_objects_list r
  WHERE 
    (...)
    AND (
      open_now IS FALSE 
      OR r.is_24_hours_7days IS TRUE
      OR (
        r.timezone_place IS NOT NULL 
        AND EXISTS (
          SELECT 1
          FROM public.opening_hours oh
          JOIN jsonb_array_elements(oh.days) as days ON r.id = oh.object_id
          WHERE 
            days ->> 'day_of_week' = ((EXTRACT(DOW FROM CURRENT_TIMESTAMP AT TIME ZONE (r.timezone_place ->> 'name')) + 6) % 7)::text
            AND CURRENT_TIME AT TIME ZONE (r.timezone_place ->> 'name') BETWEEN (days ->> 'session_start')::time AND (days ->> 'session_end')::time
        )
      )
    );
$$;

 

Kolumna timezone_place jest typu json i ma obiekt { name: string (Europe/Warsaw) }

Kolumna days z tablicy public.opening_hours przechowuje tablice obiektów w takiej formie:
 

[
  {
    "day_of_week": 0,
    "is_closed_all_day": true
  },
  {
    "day_of_week": 1,
    "session_start": "00:15",
    "session_end": "21:45"
  },
  {
    "day_of_week": 2,
    "session_start": "00:30",
    "session_end": "22:00"
  },
  {
    "day_of_week": 3,
    "session_start": "00:15",
    "session_end": "22:30"
  },
  {
    "day_of_week": 4,
    "is_closed_all_day": true
  },
  {
    "day_of_week": 5,
    "is_closed_all_day": true
  },
  {
    "day_of_week": 6,
    "is_closed_all_day": true
  }
]


Model dni wygląda tak -- stąd te przekształcenie w metodzie:

export enum Day {
    Monday = 0,
    Tuesday = 1,
    Wednesday = 2,
    Thursday = 3,
    Friday = 4,
    Saturday = 5,
    Sunday = 6,
}


Problem jest taki, ze nie zwraca mi obiektów, które są otwarte, np. teraz mamy 24.01.2024 14:45 i mimo, że opening_hours -> days mamy srode w tych godzinach oznaczoną jako otwartą to i tak nie zwraca tego rekordu:

{ "day_of_week": 2, "session_start": "00:30", "session_end": "22:00" },

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+2 głosów
2 odpowiedzi 108 wizyt
pytanie zadane 24 sierpnia 2023 w SQL, bazy danych przez gatka84 Bywalec (2,150 p.)
+1 głos
1 odpowiedź 251 wizyt
pytanie zadane 29 maja 2022 w SQL, bazy danych przez Martita Bywalec (2,500 p.)
0 głosów
1 odpowiedź 256 wizyt
pytanie zadane 25 maja 2022 w SQL, bazy danych przez Martita Bywalec (2,500 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...