Создание времени доступности для врача в PostgreSQL с использованием TSTZRANGE - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь сделать doctor_availability, как в приведенном ниже примере, атрибут, который будет массивом:

[
 [
  ["2020-03-10 09:00:00+00","2020-03-10 10:00:00+00"], False
 ],
...
...
] 

Вот так выглядит таблица доктора:

CREATE TABLE IF NOT EXISTS doctor
(
    doctor_id           SERIAL PRIMARY KEY NOT NULL,
    doctor_primary      BOOLEAN DEFAULT FALSE,
    doctor_address      TEXT               NOT NULL,
    doctor_first_name   varchar(100)       NOT NULL,
    doctor_last_name    varchar(100)       NOT NULL,
    doctor_phone_number TEXT               NOT NULL,
    doctor_office       INT                NOT NULL REFERENCES office (office_id),
    doctor_spec         TEXT               NOT NULL,
    doctor_availability availability[],
    doctor_user         SERIAL             NOT NULL REFERENCES db_user (user_id) ON UPDATE CASCADE ON DELETE CASCADE,
    doctor_diagnosis    INT,
    doctor_test         INT
);

Атрибут doctor_availability - это доступность типа, которая определяется как:

CREATE TYPE availability AS
(
    available_time TSTZRANGE,
    taken          BOOLEAN
);

У меня есть триггер, когда новый доктор - doctor_availability для нового доктора:

CREATE TRIGGER insert_doctor_availability
    BEFORE INSERT
    ON doctor
    FOR EACH ROW
    WHEN (NEW.doctor_availability IS NULL)
EXECUTE PROCEDURE insert_availability();

Функция insert_availability определяется как :

CREATE FUNCTION insert_availability() RETURNS trigger AS
$$
BEGIN
    NEW.doctor_availability := array(select tstzrange(a, a + '1 hour'::interval, '[]')
                                     from generate_series
                                              (
                                                  timestamp '2020-03-10 09:00:00',
                                                  CURRENT_TIMESTAMP + '2 YEAR',
                                                  interval '1 HOUR'
                                              ) AS a (dt)
                                     WHERE MOD(EXTRACT(DOW FROM dt)::INTEGER, 6) != 0
                                       AND dt::TIME >= '09:00:00'
                                       AND dt::TIME < '17:00:00'::TIME);
    RETURN NEW;
END
$$ LANGUAGE plpgsql;

Когда я пытаюсь добавить нового доктора, выдается ошибка:

Вставить запрос:

INSERT INTO doctor(doctor_address, doctor_first_name, doctor_last_name, doctor_phone_number, doctor_office, doctor_spec,
                   doctor_user)
VALUES ('4444 Test St. Test, TX 90000', 'Test', 'Test_last', '992000000', 1, 'ENT', 1);

[22P02] ERROR: malformed record literal: "["2020-03-10 09:00:00+00","2020-03-10 10:00:00+00"]" Detail: Missing left parenthesis. Where: PL/pgSQL function insert_availability() line 3 at assignment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...