Repetir eventos de calendario y algunas matemáticas finales.
Estoy tratando de probar los infames eventos de repetición en calendarios usando PHP / MySQL. Finalmente he encontrado algo que parece funcionar. Encontré miresponde aqui pero estoy teniendo un poco de dificultad para terminarlo.
Mis primeros eventos de mesa.
<code>ID NAME 1 Sample Event 2 Another Event </code>
Mi segunda tabla 'events_meta que almacena los datos que se repiten.
<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>
Con repeat_start es una fecha sin hora como marca de tiempo de Unix, y repeat_interval una cantidad en segundos entre intervalos (432000 es 5 días).
Luego tengo el siguiente MySQL que modifiqué ligeramente desde el enlace anterior. La fecha y hora utilizada a continuación (1299132000, que es el 12 de mayo de 2012) es el día actual sin hora.
<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>
En el MySQL anterior, el siguiente código deduce el campo repeat_start (EM1.'meta_value'
) a partir de la fecha actual y luego la divide por el campo de intervalo de repetición (EM2.'meta_value'
).
<code>ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value` </code>
O
<code>TODAYS DATE - START DATE / 5 DAYS </code>
Así que aquí están las matemáticas:
<code>1336744800 - 1336312800 = 432000 432000 / 432000 = 1 </code>
Ahora que funciona perfecto. Pero si cambio la marca de tiempo actual con 5 días de anticipación a 1336312800, que es el 17 de Mat 2012, se parece un poco a esto:
<code>1336312800 - 1336312800 = 864000 86400 / 432000 = 2 </code>
Lo cual no funciona porque es igual a 2 y en MySQL debe ser igual a 1. Entonces, supongo que mi pregunta es, ¿cómo puedo hacer que MySQL reconozca un número entero en lugar de tener que hacer esto?
<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 tenga sentido y espero que solo sea una simple cosa de matemática o una función que MySQL tenga que ayude :) ¡Gracias por su ayuda!
EDITAR: LA RESPUESTA
Gracias a @eggypal a continuación, encontré mi respuesta y, por supuesto, ¡fue simple!
<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>