Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE FUNCTION cwmars.org_is_open(org INTEGER, thedate DATE)
- RETURNS BOOLEAN AS
- $$
- DECLARE
- dow INTEGER;
- column_open TEXT;
- column_close TEXT;
- isOpen BOOLEAN;
- BEGIN
- -- Shortcut to prevent infinite loop in calling functions.
- IF NOT EXISTS(SELECT * FROM actor.hours_of_operation WHERE id = org) THEN
- RETURN TRUE;
- END IF;
- SELECT DATE_PART('DOW', thedate) - 1 INTO dow;
- IF dow = -1 THEN
- dow := 6;
- END IF;
- SELECT 'dow_'||dow||'_open' INTO column_open;
- SELECT 'dow_'||dow||'_close' INTO column_close;
- EXECUTE FORMAT('SELECT TRUE FROM actor.hours_of_operation '
- 'LEFT JOIN actor.org_unit_closed ON org_unit_closed.org_unit = hours_of_operation.id '
- 'AND $1 BETWEEN close_start::DATE AND close_end::DATE '
- 'WHERE %I <> ''00:00:00'' AND %I <> ''00:00:00'' '
- 'AND hours_of_operation.id = $2 '
- 'AND org_unit_closed IS NULL;', column_open, column_close)
- INTO isOpen
- USING thedate, org;
- IF isOpen IS NULL THEN
- isOpen := FALSE;
- END IF;
- RETURN isOpen;
- END;
- $$
- LANGUAGE plpgsql;
- CREATE OR REPLACE FUNCTION cwmars.next_open_date(org INTEGER, thedate DATE)
- RETURNS DATE AS
- $$
- DECLARE
- condVariable BOOLEAN;
- BEGIN
- SELECT cwmars.org_is_open(org, thedate) INTO condVariable;
- WHILE condVariable IS FALSE LOOP
- thedate := thedate + '1 day'::INTERVAL;
- SELECT cwmars.org_is_open(org, thedate) INTO condVariable;
- END LOOP;
- RETURN thedate;
- END;
- $$
- LANGUAGE plpgsql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement