Генерируйте временные интервалы для бронирования встречи, используя серию - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь сгенерировать функцию доступного временного интервала.за каждый день я записываю время начала и окончания.

for eg: start time is 08:00 AM and end time is 03:00 PM.

У меня есть другая таблица, которая фиксирует время перерыва на тот же день,

for eg: 11:00 AM to 11:15 AM and 01:00 PM to 1:30 PM.

И в другой таблице я храню уже забронированные слоты

for eg: 
09:00 AM to 09:30 AM
11:15 AM to 11:45 AM
01:30 PM 02:00PM

Я использую generate_series для генерации временных интервалов между временем начала и окончания.

select * FROM generate_series(
       timestamp '2016-11-09 08:00 AM',
       timestamp '2016-11-09 03:00 PM',
       INTERVAL '30m'
    ) t

Мне нужно исключить время перерыва и уже забронированное время из этого сгенерированного ряда.Я пытался использовать, кроме функции, но этот слот с 11:15 до 11:45 не может удалить.Как я обычно пишу условие для удаления этого?

За исключением запроса

SELECT t
    FROM generate_series(
       timestamp  '2016-11-09 08:00 AM',
       timestamp  '2016-11-09 03:00 PM',
       INTERVAL '1 hour'
    ) t
    EXCEPT
    SELECT concat(start_date,' ' , start_time)::timestamp as booked 
    FROM my_table where start_date::date = '2016-11-09';

my_table details

CREATE TABLE public.my_table
(
id bigint NOT NULL,
start_date character varying(500),
start_time character varying(500),
CONSTRAINT pk_my_table PRIMARY KEY (id))
WITH (
OIDS=FALSE
);

1 Ответ

0 голосов
/ 23 октября 2018

Следующие работы, я предлагаю вам использовать меньший интервал, вероятно, 15 минут:

with my_table as (
    select '09:00 AM' start_time , '2016-11-09'::character varying start_date
    )

SELECT *
    FROM generate_series(
       timestamp  '2016-11-09 08:00 AM',
       timestamp  '2016-11-09 03:00 PM',
       INTERVAL '15 minutes'
    ) t
EXCEPT
SELECT concat(start_date,' ' , start_time)::timestamp as booked 
FROM my_table where start_date::date = '2016-11-09'

Но, честно говоря, я просто не буду хранить встречу в виде строки, которая выглядит как дата, или строки, которая выглядиткак время суток.Столбец с символами (500) с радостью примет такие данные, как 'this is not a date or a time', и вдруг у вас будет ошибка, потому что она не будет преобразована.или даты, такие как 30/02/2019, могут существовать в данных, и их будет трудно найти.

Почему бы просто не сохранить начало встречи как метку времени?Это было бы намного эффективнее.например,

with my_table as (
    select '2016-11-09 09:00:00'::timestamp start_date
    )


SELECT *
    FROM generate_series(
       timestamp  '2016-11-09 08:00 AM',
       timestamp  '2016-11-09 03:00 PM',
       INTERVAL '15 minutes'
    ) t
EXCEPT
SELECT start_date
FROM my_table 
where start_date >= '2016-11-09' and start_date < '2016-11-10'

Такой запрос будет использовать индекс для этого столбца start_date для фильтрации данных.

Пожалуйста, не используйте строки для хранения дат или времени.Я бы тоже не отделил дату от времени суток.

...