Структура базы для периодичных и не очень событий

Dreammaker
На сайте с 20.04.2006
Offline
570
827

Стукнулся ко мне в асю знакомый и попросил совета:

надо в БД организовать мероприятия. одни проходят по конкретной дате, другие - раз в неделю, третьи каждый день... знатоки, внимание вопрос - как это все красиво организовать. не сталкивался в практике ни с чем похожим?
этот - по понедельникам, а этот по 15-м числам месяца

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

ПЗ
На сайте с 10.10.2006
Offline
92
#1
Dreammaker:
Стукнулся ко мне в асю знакомый и попросил совета:





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

как пример, можно посмотреть на формат конфига крона

Автомобили в России (http://www.autobb.ru/). Спецтехника BIZ - вся строительная, дорожная, коммунальная техника (http://www.spectehnika.biz/) и другая спецтехника в одном месте.
[Удален]
#2

Попробуйте здесь посмотреть

Dreammaker
На сайте с 20.04.2006
Offline
570
#3

Так-с, хорошие советы. 🚬Уже есть над чем подумать.

Если у кого-то ещё возникнут какие идеи - будем рады услышать. :)

Dreammaker
На сайте с 20.04.2006
Offline
570
#4

Знакомый посмотрел оба варианта и ему больше нравится вариант, который в MSDN описан, но при этом


а вот у msdn довольно интересно... правда как обычно запутанно

И картинку в тему дал:

jpg windows_vista.jpg
[Удален]
#5

мероприятия? - я так понимаю это вывод какой либо разной инфы в заданный промежуток времени в определенном месте в качестве компонента страницы?

у нас в cms это есть.

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

статьи - это пример - можно организовать разные события и действия.

Dreammaker
На сайте с 20.04.2006
Offline
570
#6
vcxz:
значение либо цикл и время от и до

а как в этом случае, задаётся, например, каждый вторник и как выбираются данные?

N_MONax
На сайте с 22.08.2007
Offline
112
#7
Dreammaker:
а как в этом случае, задаётся, например, каждый вторник и как выбираются данные?

Очень просто.

Берём заранее известную, прошедшую дату, большую, чем недельной давности.

Например, 2 марта 2009 года - понедельник.

Берём дату, для которой надо определить день недели.

Например, 21 марта 2009 года.

Получаем разницу между датами в сутках. Лично я бы использовал формат времени UNIX.

Ищем остаток от деления этой разницы на 7:

0 - понедельник, 1 - вторник, ... 6 - воскресенье.

В нашем примере - 21-2 = 19.

Остаток от деления на 7 = 5

Следовательно, 21 марта 2009 года - суббота.

На php, например - 3 строки кода.

Полный спектр услуг в интернете. Быстро, Качественно, Дорого. Пишите в личку.
Dreammaker
На сайте с 20.04.2006
Offline
570
#8

N_MONax, я не совсем о том - получить день недели конкретной даты можно намного проще с помощью той же функции date().

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

Собственно, задача для меня чисто академическая ибо решает её знакомый, но всё же придумать алгоритмы для общего развития хотелось бы :)

dmitcat
На сайте с 26.05.2005
Offline
123
#9
Dreammaker:
N_MONax, Но теперь не могу придумать как выдёргивать "хронические" события, например, те которые должны происходить раз в несколько дней.

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

при создании события выбирается тип: раз в N дней, каждый день недели, каждое NN число месяца и т.д. (сколько придумаете). в момент создания события, в зависимости от типа, рассчитывается число дней до очередного события и пишется в счетчик события

на крон вешате скрипт который будет пробегать по событиям и уменьшать "счетчик" на 1 каждый день

соответственно при выборке событий которые должны произойти сегодня - выбираем записи у которых счетчик=0

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

как то так можно :)

Либо селяВи (http://www.puper.ru), либо селяВас (http://www.puper.ru)!!!
[Удален]
#10

Я бы сделал для каждого события всего 2 поля - дата начала и интервал повторения.

интервал повторения типа text и там либо число в секундах (раз в неделю, в день), либо "monthly"/"weekly"/"annual"

те которые по 15м числам - в дату начала 15е число первого раза, в интервал - monthly

те которые каждый понедельник - в дату начала нужный понедельник, в интервал - 7 * 86400 или weekly

те которые один раз - интервал 0

ну и так далее

Высчитывать дату следующего события можно и без крона - ceil((time()-start_date)/interval)*interval+start_date

Дату прошлого события - вместо ceil поставить floor. Ну и проверки на interval==0

neolord добавил 16.03.2009 в 16:05

Dreammaker:

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

поиск по дате - высчитываем разницу в датах между 17.03.2009 и датой начала и сравниваем остаток от деления на интервал с нулем.

по дню недели - в mysql тоже функции есть, выбираем где день начала - вторник и интервал кратен неделе

хронические - выбирать по интервалу

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий