Следующие работы, я предлагаю вам использовать меньший интервал, вероятно, 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 для фильтрации данных.
Пожалуйста, не используйте строки для хранения дат или времени.Я бы тоже не отделил дату от времени суток.