- Se necesita generar el reporte por semana del año (indicando claro el rango de fechas de la semana)
- Se necesita generar el reporte para un rango de fechas específico, pero en el resultado se debe indicar el numero de semana para cada fecha que este dentro del rango.
Muchos quizás dirán que es algo muy trivial o incluso ya existirá una función en PHP que lo hace todo, pero como dije para mi no lo fue, no dí con algo que me solucionara el problema rápidamente, y como estaba trabajando con MySQL, traté de hallar una solución con la base de datos, la cual encontré en estas dos consultas:
SELECT WEEKOFYEAR('2012-10-14') as Semana,
(WEEKDAY('2012-10-14')+1) as DiaSemana,
DAYOFYEAR('2012-10-14') as DiaAnno,
DAYNAME('2012-10-14') as NombreDia,
TIMESTAMPADD(DAY,(0-WEEKDAY('2012-10-14')),'2012-10-14') as PrimerDiaSemana,
TIMESTAMPADD(DAY,(6-WEEKDAY('2012-10-14')),'2012-10-14') as UltimoDiaSemana
SELECT MAKEDATE(YEAR(NOW()),(1*7)),
TIMESTAMPADD(DAY,(0-WEEKDAY(MAKEDATE(YEAR(NOW()),(1*7)))),
MAKEDATE(YEAR(NOW()),(1*7))) as PrimerDiaSemana,
TIMESTAMPADD(DAY,(6-WEEKDAY(MAKEDATE(YEAR(NOW()),(1*7)))),
MAKEDATE(YEAR(NOW()),(1*7))) as UltimoDiaSemana
Como se puede apreciar es un tema simple conociendo las funciones adecuadas; a continuación detallo cada acción para la consulta 1 que recibe una fecha:
Weekofyear('2012-10-14'): en base a la fecha retorna la semana a la que pertenece.
Weekday('2012-10-14'): Retorna el día de la semana para esa fecha en partícular (0 es lunes, por eso sumo 1 para hacer una correspondencia más cercana a lo que se usa normalmente).
Dayofyear('2012-10-14'): Retorna el numero del día en el año (entre 1 y 365) para la fecha indicada.
DayName('2012-10-14'): Retorna el nombre del día para la fecha indicada (Lunes, martes, miércoles..... ).
Timestampadd(...): Esta función suma un numero determinado (segundo parámetro)de días, meses o lo que se defina en el primer parámetro a una fecha determinada (tercer parámetro). Como la idea es conseguir el primer y último día de la semana en el segundo parámetro se juega con la diferencia entre el día de la semana (Weekday) y el numero de días de la semana (entre 0 y 6), el numero positivo o negativo nos dará el día inicial o el final.
La segunda consulta recibe el numero de semana y entrega el primer y último día haciendo uso de la misma función de la consulta anterior (Timestampadd) pero agregando algo:
- Makedate(Year(now()),(1*7)): Makedate es una función que retorna una fecha a partir del año y numero de día, por eso se utiliza Year(now()) para obtener el año actual como primer parámetro, el segundo es la multiplicación (1*7) que corresponde al número de la semana multiplicado por el número de días de la semana, con esto se obtiene una fecha de la semana que se necesita (basta con reemplazar el 1 en las multiplicaciones por el numero de semana que se quiere)y desde allí es posible obtener el día inicial y final.
me da flojera leer tu codigo en miniatura, mevoy a otro blog.....
ResponderEliminaramigo gracias por el contenido, me va a servido de mucho. saludos
EliminarGracias por la consulta, exactamente lo que buscaba
ResponderEliminarLa segunda consulta no funciona para la semana 1 de los años que comienzan de martes para adelante. Por ejemplo en el 2015, la semana 1 comienza un jueves y no devuelve la fecha inicial.
ResponderEliminarGRACIAS POR EL APORTE NOS SIRVIO IGUAL PARA UN PROYECTO HACIENDO OTRO TIPO DE CONSULTAS PARA EVALUAR SEMANLMENTE
ResponderEliminarGRACIAS POR EL APORTE NOS SIRVIO IGUAL PARA UN PROYECTO HACIENDO OTRO TIPO DE CONSULTAS PARA EVALUAR SEMANLMENTE
ResponderEliminarMuchas Gracias por tu aporte
ResponderEliminarGenial! Gracias es justo lo que estaba buscando xDDD mil gracias!!
ResponderEliminarWOW me quede corta, eres una angel!!! mil mil mil gracias eres un amor!!! te deseo exitos en todo!
ResponderEliminarchulada, ya no tenia cabeza para pensar en la solucion y con esto ufff! Gracias man!
ResponderEliminarGracias por el dato, me sirve para hacer una seleccion semanal
ResponderEliminarGracias me ayudo mucho la explicacion.
ResponderEliminarsaludos!!
Muchas gracias, me ayudo mucho.
ResponderEliminarBUEN POST, MUX EXPLICATIVO Y SOBRE TODO UTILIZABLE APESAR QUE ES VIEJO EL POST!!!
ResponderEliminar