Самая низкая степень детализации, которая вам нужна, это, вероятно, минуты (на самом деле, вероятно, 15-минутные интервалы, но назовите это минут).
Возможно, вы также захотите рассмотреть день недели.
Если вы используете таблицу, такие как:
create table day_of_week_opening_hours(
id integer primary key,
day_of_week integer not null,
store_id integer not null,
opening_minutes_past_midnight integer default 0 not null,
closing_minutes_past_midnight integer default (24*60) not null)
Поп уникальное ограничение на store_id и DAY_OF_WEEK, и для данного магазина и день недели вы можете найти время открытия с:
the_date + (opening_minutes_past_midnight * interval '1 minute')
или ...
the_date + (opening_minutes_past_midnight/(24*60))
Магазины, которые открыты 24 часа в сутки, может быть представлена в виде а не время открытия, в отдельной таблице вместо специального времени открытия и закрытия, или, может быть, вы можете просто оставить время открытия/закрытия нулевым.
create table day_of_week_24_hour_opening(
id integer primary key,
day_of_week integer not null,
store_id integer not null)
Подумайте о магазинах, которые вообще не открываются в определенный день, и как их представлять.
Возможно, вы также можете использовать переопределение даты, чтобы указать разные (или нет) часы работы в определенные даты (Рождество и т. Д.).
Довольно интересная проблема, это.
Почему вы считаете, что наличие двух атрибутов, которые записывают различную информацию, выглядит не очень хорошо? Разве это не самый очевидный способ сделать это? – jpw
@jpw прав, но вы также можете использовать что-то вроде BigInt для хранения начала и конца в высоких и низких байтах, как в старые сладкие времена :) Кстати, что такое БД? – LINQ2Vodka
@jim Это были дни, а? – jpw