2013-11-10 2 views
2

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

Интуитивно понятным решением будет иметь начальное и конечное время для каждого дня. Но это означает два атрибута в день, что выглядит не очень хорошо.

Другим подходом было бы иметь начальное время и интервал day to second для каждого дня. Но все же это означает два атрибута.

Что является наиболее распространенным и простым способом представить это? Я работаю с оракулом.

+3

Почему вы считаете, что наличие двух атрибутов, которые записывают различную информацию, выглядит не очень хорошо? Разве это не самый очевидный способ сделать это? – jpw

+0

@jpw прав, но вы также можете использовать что-то вроде BigInt для хранения начала и конца в высоких и низких байтах, как в старые сладкие времена :) Кстати, что такое БД? – LINQ2Vodka

+1

@jim Это были дни, а? – jpw

ответ

1

Я думаю, что имеет смысл иметь два столбца один для Open DateTime и One for Close Datetime. Поскольку, как только магазин открыт, его когда-нибудь придется закрыть.

Мой Предложение
Я хотел бы создать отдельную таблицу для магазина открытия/закрытия Times. Поскольку каждый раз, когда открыт магазин, у него будет также близкое значение времени, так что у вас не будет никаких нежелательных нулей во втором столбце. для меня совершенно необходимо иметь отдельную таблицу для закрытия магазина.

0

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

0

Ваши требования имеют две точки данных: время открытия и время закрытия. Существуют различные способы представления информации, но вам понадобятся два атрибута.

Я понимаю, почему вы считаете, что наличие двух атрибутов приведет к «более длительному условию проверки»: «заданное время находится в интервале». Но Oracle предоставляет множество способов манипулирования своим типом данных DATE . Find out more.

Одна полезная маска - 'SSSSS', которая представляет собой число секунд за полночь. Так что, если вы держите время открытия и закрытия в секундах вы можете проверить интервал, как это:

select * from shop 
where sysdate between trunc(sysdate) + (opening_time_sssss/86400) 
       and trunc(sysdate) + (closing_time_sssss/86400) 

Я не говорю, что это элегантный, но она эффективна.


На самом деле, можно было бы хранить часы в одном атрибуте, представляя их в виде битовой маски в RAW колонке. Это было бы труднее понять и даже менее элегантно проверять.

2

я сделал нечто подобное один раз, и я использовал ЧИСЛА:

START_DATE END_DATE 
0700  1800 
0915  1745 
0600  2300 
1115  2215 

Это было легко использовать с простым SQL т.е. с BETWEEN пункта.

Что делать, если в магазине есть перерыв?

2

Самая низкая степень детализации, которая вам нужна, это, вероятно, минуты (на самом деле, вероятно, 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) 

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

Возможно, вы также можете использовать переопределение даты, чтобы указать разные (или нет) часы работы в определенные даты (Рождество и т. Д.).

Довольно интересная проблема, это.

Смежные вопросы