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" },