Estoy creando una aplicación web que funcione paralelamente a un foro que llevo. En ella, una de las cosas que estoy haciendo es introducir un sistema de estadísticas propio que trabajará con chartjs. Una de las cosas primordiales es extraer la información necesaria por lo que tengo que atacar a consultas a la base de datos.
Mi experiencia con MySQL no es muy alta así que me encuentro con algunos interrogante como es este de las fechas epoch que me estan dificultando algo las consultas.
Mi intención es la siguiente. Quiero extraer de la base de datos todos los posts creados en el foro desde la fecha actual hasta 14 dias atrás (aunque luego eso podría ser parametrizado para que cada usuario elija el intervalo que desee... para no complicarme de momento, en principio ese intervalo) y luego agrupar todos los posts de cada dia para determinar cuantos posts se introdujeron cada dia.
Pues bien después de muchas horas de darle vueltas conseguí que funcionase la consulta "mas o menos" y es que esto de las fechas me está matando... os muestro el código que he usado para conseguir lo que tengo:
Código PHP :
$f_fin= time(); //Aquí la fecha actual, que php me devuelve en formato de fecha epoch $f_inicio= time()-(14 * 24 * 60 * 60);//Aquí la fecha final del intervalo deseado, que como podéis ver, resta un numero concreto de segundos. No creo que haga falta explicar esas multiplicaciones, es lo mas legible a la hora de revisar cuanto intervalo estoy usando.
... y con esas 2 variables definidas, ahora voy al codigo del MySQL
Código MySQL :
SELECT DATE_FORMAT(FROM_UNIXTIME( post_time),'%y %m %d') as post_time2,post_time, COUNT(post_time) FROM tabla_posts WHERE post_time BETWEEN '".$f_inicio."' AND '".$f_fin."' GROUP BY post_time2 ORDER BY post_time DESC
Esto me devuelve en principio lo que quiero pero con una particularidad no deseada, al trabajar la tabla (y en concreto el campo de fecha) con fechas epoch (en segundos), la fórmula lo que hace es calcular desde la fecha exácta de la ejecución de la consulta (ajustada al segundo) un intervalo que va desde ese preciso instante hasta 1.209.600 segundos atrás ¿cual es el resultado?
El resultado es que en la fecha de HOY me muestra las entradas de 'HOY' contando desde este preciso instante hacia atrás 24 horas (lo cual implica que recoge valores del dia de ayer y los cuenta como de hoy) y así hasta el final de intervalo.
Explicado de otra forma, no tiene encuenta cuando empieza o acaba 'oficialmente' un dia, el 'corte' lo hace, digamos, por saltos de 24 horas hacia atrás. Lo que yo quiero (y creo que es lo correcto) es que cuente las entradas de cada dia teniendo en cuenta el 'cambio oficial/natural' de fecha, recogiendo también, del dia del final de intervalo (a fecha de este post sería el 2 de agosto), no solo los posts que hay dentro del intervalo especificado (al segundo) sino que todos los posts naturales de ese dia).
He de decir, para quien quiera ayudarme que empecé a usar una mezcolanza de instrucciones de MySQL para convertir todas las fechas de la consulta a un formato '%Y-%m-%d' con lo que poder solventar el asunto, tales como FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d'), pero en mis intentonas no he conseguido que devuelva siquiera resultados y no sé qué estoy haciendo mal.
*Aquí tenéis un ejemplo de lo que digo en mi último párrafo pero aplicado a los posts escritos por un usuario en concreto en los últimos 14 dias y de cuya consulta no consigo extraer datos... pero que es donde intento pre-formatear las fechas primero para que los intervalos no estén conteadas al segundo:
Código MySQL :
SELECT DATE_FORMAT(FROM_UNIXTIME( post_time),'%y %m %d') as post_time2, poster_id, post_time, COUNT(poster_id) FROM tabla_posts WHERE poster_id='136393' AND FROM_UNIXTIME(post_time, '%Y-%m-%d') BETWEEN FROM_UNIXTIME(DATE(), '%Y-%m-%d') AND FROM_UNIXTIME(DATE()-14, '%Y-%m-%d') GROUP BY post_time2,poster_id ORDER BY post_time DESC
¿alguien puede ayudarme?