Repetindo eventos do calendário e algumas contas finais
Eu estou tentando ir para os infames eventos repetidos em calendários usando PHP / MySQL. Eu finalmente encontrei algo que parece funcionar. Eu encontrei meuresponda aqui mas estou tendo um pouco de dificuldade para terminar.
Minha primeira mesa 'eventos'.
<code>ID NAME 1 Sample Event 2 Another Event </code>
Minha segunda tabela 'events_meta que armazena os dados repetidos.
<code>ID event_id meta_key meta_value 1 1 repeat_start 1336312800 /* May 7th 2012 */ 2 1 repeat_interval_1 432000 /* 5 days */ </code>
Com repeat_start sendo uma data sem tempo como um registro de data e hora unix, e repeat_interval um valor em segundos entre intervalos (432000 é de 5 dias).
Eu tenho então o seguinte MySQL que eu modifiquei ligeiramente do link acima. O registro de data e hora usado abaixo (1299132000, que é 12 de maio de 2012) é o dia atual sem tempo.
<code>SELECT EV.* FROM `events` EV RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id` RIGHT JOIN `events_meta` EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` ) WHERE EM1.meta_key = 'repeat_start' AND ( ( CASE ( 1336744800 - EM1.`meta_value` ) WHEN 0 THEN 1 ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` END ) ) = 1 </code>
No MySQL acima, o código a seguir deduz o campo repeat_start (EM1.'meta_value'
) a partir da data atual e, em seguida, divide-a pelo campo de intervalo de repetição (EM2.'meta_value'
).
<code>ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` </code>
OU
<code>TODAYS DATE - START DATE / 5 DAYS </code>
Então aqui está a matemática:
<code>1336744800 - 1336312800 = 432000 432000 / 432000 = 1 </code>
Agora isso funciona perfeito. Mas se eu mudar o timestamp atual com 5 dias de antecedência para 1336312800, que é o 17th Mat 2012, será mais ou menos assim:
<code>1336312800 - 1336312800 = 864000 86400 / 432000 = 2 </code>
O que não funciona porque é igual a 2 e no MySQL ele precisa ser igual a 1. Então, eu acho que minha pergunta é, como faço para que o MySQL reconheça um número inteiro ao invés de ter que fazer isso?
<code>... WHERE EM1.meta_key = 'repeat_start' AND ( ( CASE ( 1336744800 - EM1.`meta_value` ) WHEN 0 THEN 1 ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` END ) ) = IN (1,2,3,4,5,6,7,8,....) </code>
Espero que eu esteja fazendo sentido e espero que seja apenas uma coisa simples de matemática ou uma função que o MySQL tem que ajudará :) Obrigado pela sua ajuda!
EDIT: a resposta
Graças ao @eggypal abaixo, eu encontrei a minha resposta e, claro, foi simples!
<code>SELECT EV.* FROM elvanto_calendars_events AS EV RIGHT JOIN elvanto_calendars_events_meta AS EM1 ON EM1.`event_id` = EV.`id` RIGHT JOIN elvanto_calendars_events_meta AS EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` ) WHERE EM1.meta_key = 'repeat_start' AND ( ( 1336744800 - EM1.`meta_value` ) % EM2.`meta_value`) = 0 </code>