powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Время работы заведений
22 сообщений из 22, страница 1 из 1
Время работы заведений
    #37253424
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Столкнулся с распространенной, наверное, задачей хранения времени работы заведения и поиска открытых сейчас или в какое-то определенное время. Заведения могут работать по-разному в зависимости от дня недели (возможно также праздничных дней, но это как-то совсем сложно), могут иметь всякие перерывы на обеды и прочие дырки.
Что можно почитать по этому поводу? Что спрашивать у гугла? Или может кто-нибудь в двух словах опишет идею?

Заранее благодарен. Саша.
...
Рейтинг: 0 / 0
Время работы заведений
    #37254260
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А причем тут PostgreSQL ?
...
Рейтинг: 0 / 0
Время работы заведений
    #37254322
bububu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Judo,

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

В связи с темой приходит на ум только производственный календарь - это по поводу поискать в гугле.
...
Рейтинг: 0 / 0
Время работы заведений
    #37254968
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bububuJudo,

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

В связи с темой приходит на ум только производственный календарь - это по поводу поискать в гугле.

где то тут были правила оформления тем :-)))
...
Рейтинг: 0 / 0
Время работы заведений
    #37255086
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Judoгде то тут были правила оформления тем :-)))

Я как-то раз решал проблему общими способами, а потом выяснилось, что лучшим решением было субд-зависимым. Может в постгресе есть специальные типы и индексы, пользуясь которыми можно элегантно решить проблему.
...
Рейтинг: 0 / 0
Время работы заведений
    #37255101
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ec2Judoгде то тут были правила оформления тем :-)))

Я как-то раз решал проблему общими способами, а потом выяснилось, что лучшим решением было субд-зависимым. Может в постгресе есть специальные типы и индексы, пользуясь которыми можно элегантно решить проблему.

ну вот я до этого все понимал, ну прям все понимал что написано, а тут бац и ваще как в тумане :-))))))
...
Рейтинг: 0 / 0
Время работы заведений
    #37255720
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 9.0 появился специальный тип индексов что-то с временными промежутками... Курите маны.
...
Рейтинг: 0 / 0
Время работы заведений
    #37255838
Big Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ec2,
Ваша задача решается просто, если вы соответсвующим образом реализуете свою схему данных, например сделав таблицу в которой указаны интеррвалы работы указанных объектов.
Но туманные описания и постановка задачи генерируют еще более туманные ответы
...
Рейтинг: 0 / 0
Время работы заведений
    #37255851
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big Andyec2,
Ваша задача решается просто, если вы соответсвующим образом реализуете свою схему данных, например сделав таблицу в которой указаны интеррвалы работы указанных объектов.
Но туманные описания и постановка задачи генерируют еще более туманные ответы

Я сделал так: создал таблицу working_days(id, business_id, day_of_week:integer, from:time, to:time) и достаю объекты вот так:
Код: plaintext
1.
select * from businesses b join working_days wd on wd.business_id = businesses.id
where wd.day_of_week = given_day and given_time between wd.from and wd.to;

Я почему-то думал, что сформулировал корректно. Извиняюсь.
Какие индексы лучше навешать на таблицу working_days? Или вообще все выкинуть и сделать с начала? Или лучше убиться об стену, как некоторые тут втайне желают?
...
Рейтинг: 0 / 0
Время работы заведений
    #37255976
1чайнег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ec2 Я сделал так: создал таблицу working_days(id, business_id, day_of_week:integer, from:time, to:time) и достаю объекты вот так:
Код: plaintext
1.
select * from businesses b join working_days wd on wd.business_id = businesses.id
where wd.day_of_week = given_day and given_time between wd.from and wd.to;

и это правильно (с)

(как будете вводить ночные/круглосуточные заведения с from_time во вчера, а to_time - в будущую пятницу ?
дробить через полночь?)



,но, я думаю, по большому, надо создать еще таблицу исключений (она же, обычно, - праздников и т.п. - в случае "раб-календаря")

которая будет безусловно перекрывать таблицу "working_days" для тех дат, которые в ней явно указаны. вместо day_of_week:integer <-> day:date[, + статус ].
(иногда туда автоматом загоняют весь календарь, но это, имхо, лишнее)
...
Рейтинг: 0 / 0
Время работы заведений
    #37255986
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1чайнег
(как будете вводить ночные/круглосуточные заведения с from_time во вчера, а to_time - в будущую пятницу ?
дробить через полночь?)



,но, я думаю, по большому, надо создать еще таблицу исключений (она же, обычно, - праздников и т.п. - в случае "раб-календаря")

которая будет безусловно перекрывать таблицу "working_days" для тех дат, которые в ней явно указаны. вместо day_of_week:integer <-> day:date[, + статус ].
(иногда туда автоматом загоняют весь календарь, но это, имхо, лишнее)

Исключения пока не собираемся рассматривать, а ночные придется, наверное, через полночь пропускать. Ну и всякие "до последнего посетителя" здесь никак не учитываются.
...
Рейтинг: 0 / 0
Время работы заведений
    #37256040
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а давайте так

таблица неработы:

business_id foreign key
start timestamp
duration interval
period interval

выходные: '2011-01-01', '2 days', '1 week'
ночь: '2011-01-01 20:00', '8 hours', '1 day'
обед: '2011-01-01 13:00', '2 hours', '1 day'
поздний понедельник: '2011-01-03 08:00', '3 hours', '1 week'
ранняя пятница: '2011-01-07 19:00', '1 hour', '1 week'
9 мая: '2011-05-09', '1 day', '1 year'

сейчас не работают:

SELECT business_id ... WHERE ( now() - start ) % period < duration

санитарный день в первую среду каждого месяца в такую схему не ложится
...
Рейтинг: 0 / 0
Время работы заведений
    #37256117
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исправление

выходные: '2011-01-01', '2 days', '1 week'
ночь: '2011-01-01 20:00', '12 hours', '1 day'
обед: '2011-01-01 13:00', '2 hours', '1 day'
поздний понедельник: '2011-01-03 08:00', '3 hours', '1 week'
ранняя пятница: '2011-01-07 19:00', '1 hour', '1 week'
9 мая: '2011-05-09', '1 day', '1 year'
...
Рейтинг: 0 / 0
Время работы заведений
    #37256207
Big Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это классичская задача учёта рабочего времени и шедуллинга.
Упрощённо у нас это реализовано так:

id serial
obj_id integer, --foreign key. Описывает идентификатор объекта
self_fk,-- поле для автореккурсии. Например, идентификатор записи с рабочим временем, которая обозначает, что,н например зависимая запись с временнЫм интервалом и соответствующим tinterval_type есть запись рабочего перерыва для данноо объекта и для данного родительского интервала времени (если хотите, исключение)
tinterval_type, --Тип временнОго интервала, как то: (рабочеее время, перерыв, время перекуров, исключения и пр...)
tinterval_start timestamp, --дата-время начала интервала /события
tinerval_end timestamp --дата-время окончания интервала /события
...
Рейтинг: 0 / 0
Время работы заведений
    #37256329
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big AndyЭто классичская задача учёта рабочего времени и шедуллинга.
Упрощённо у нас это реализовано так:

id serial
obj_id integer, --foreign key. Описывает идентификатор объекта
self_fk,-- поле для автореккурсии. Например, идентификатор записи с рабочим временем, которая обозначает, что,н например зависимая запись с временнЫм интервалом и соответствующим tinterval_type есть запись рабочего перерыва для данноо объекта и для данного родительского интервала времени (если хотите, исключение)
tinterval_type, --Тип временнОго интервала, как то: (рабочеее время, перерыв, время перекуров, исключения и пр...)
tinterval_start timestamp, --дата-время начала интервала /события
tinerval_end timestamp --дата-время окончания интервала /события

Но мне же нужна обобщенная система, не зависящая от конкретного времени. "В любой четверг заведение работает с 9 до 17", а не 12 мая 2011 года работает с 9 до 17. Или я чего-то не понимаю?
...
Рейтинг: 0 / 0
Время работы заведений
    #37256381
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, вам сюда - "проектирование баз данных":
http://www.sql.ru/forum/actualtopics.aspx?bid=36
...
Рейтинг: 0 / 0
Время работы заведений
    #37256577
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big Andy> Это классичская задача учёта рабочего времени и шедуллинга.

да-да, получается похоже на crontab файл

таблица неработы:

business_id
interval_id

таблица интервалов:

interval_id -- НЕ первичный ключ
start interval
stop interval
period enum('year','month','week','day',..) -- см. date_trunc

'выходные', '5 days', '7 days', 'week'
'вечерняя ночь', '20 hours', '24 hours', 'day'
'утренняя ночь', '0 hours', 8 hours', 'day'
'обед', '13 hours', '15 hours', 'day'
'поздний понедельник', '0 days 8 hours', '0 days 11 hours', 'week'
'ранняя пятница', '4 days 19 hours', '4 days 20 hours', 'week'
'9 мая', '4 months 8 days', '4 months 9 days', 'year'
'санитарный день', '0 days', '7 days', 'month' -- в начале месяца,
'санитарный день', '2 days', '3 days', 'week' -- а именно в среду

сейчас не работают:

SELECT business_id ... WHERE interval_id IN ( SELECT interval_id, bool_and( now() - date_trunc( period, now() ) between start and stop ) as не_работает ... GROUP BY 1 HAVING не_работает = true )
...
Рейтинг: 0 / 0
Время работы заведений
    #37256637
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat,

Спасибо за отклик!
...
Рейтинг: 0 / 0
Время работы заведений
    #37256739
Big Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ec2,

авторВ любой четверг заведение работает с 9 до 17", а не 12 мая 2011 года работает с 9 до 17. Или я чего-то не понимаю?
Наверное. НЕ вижу ничего невозможного для реализации вашей тезы на приведённой схеме данных..
...
Рейтинг: 0 / 0
Время работы заведений
    #37256742
ec2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big Andyec2,

авторВ любой четверг заведение работает с 9 до 17", а не 12 мая 2011 года работает с 9 до 17. Или я чего-то не понимаю?
Наверное. НЕ вижу ничего невозможного для реализации вашей тезы на приведённой схеме данных..

Я вижу :) Буду думать.
...
Рейтинг: 0 / 0
Время работы заведений
    #37256897
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Big Andyid serial
obj_id integer, --foreign key. Описывает идентификатор объекта
self_fk,-- поле для автореккурсии. Например, идентификатор записи с рабочим временем, которая обозначает, что,н например зависимая запись с временнЫм интервалом и соответствующим tinterval_type есть запись рабочего перерыва для данноо объекта и для данного родительского интервала времени (если хотите, исключение)
tinterval_type, --Тип временнОго интервала, как то: (рабочеее время, перерыв, время перекуров, исключения и пр...)
tinterval_start timestamp, --дата-время начала интервала /события
tinerval_end timestamp --дата-время окончания интервала /события

авторВ любой четверг заведение работает с 9 до 17"...... НЕ вижу ничего невозможного для реализации вашей тезы на приведённой схеме данных..может туплю? покажете содержимое таблицы для этого примера и селект-запрос?
...
Рейтинг: 0 / 0
Время работы заведений
    #37257165
Big Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat,
В топике я указал, что упрощённая схема данных.
Поэтому запрос будет очень простой, например, простите за склероз.
select * from shed_target where (tinterval_type.sh_day)=4 and tinterval.start:time>='9:00' and tinterval_end::time<='17:00'

Есть (у нас) маленькая хитрость. Поскольку логика переносилась с DB2 5.5, то множество полей есть ссылки на другие структуры БД (такое крюкорукое творчество на тему ORDBMS), имеющие соответсвующий тип. .

Модератор: Тема перенесена из форума "PostgreSQL".
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Время работы заведений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]