Ofrece el servidor de la tabla de Oracle una función incorporada, TRUNC(timestamp,'DY')
. Esta función convierte cualquier marca de tiempo a la medianoche del domingo anterior. ¿Cuál es la mejor manera de hacer esto en MySQL?
Oracle también ofrece TRUNC(timestamp,'MM')
convertir una marca de tiempo a la medianoche del primer día del mes en que ocurre. En MySQL, este es sencillo:
TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))
Pero este DATE_FORMAT
truco no funcionará durante semanas. Soy consciente de la WEEK(timestamp)
función, pero realmente no quiero un número de semana dentro del año; este material es para trabajos de varios años.
TRUNC(date, 'DY' )
obtiene semanas con un comienzo en domingo.'W'
comienza el lunes, al menos en mi sistema.Respuestas:
Puede usar
YEAR(timestamp)
yWEEK(timestamp)
, y usar estas dos expresiones enSELECT
laGROUP BY
cláusula y.No demasiado elegante, pero funcional ...
Y, por supuesto, también puede combinar estas dos partes de fecha en una sola expresión, es decir, algo como
SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc... FROM ... WHERE .. GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))
Editar : como señala Martin , también puede usar la
YEARWEEK(mysqldatefield)
función, aunque su salida no es tan agradable a la vista como la fórmula más larga anterior.Edición 2 [¡3 1/2 años después!]:
YEARWEEK(mysqldatefield)
Con el segundo argumento opcional (mode
) establecido en 0 o 2 es probablemente la mejor manera de agregar por semanas completas (es decir, incluidas las semanas que van más allá del 1 de enero), si es lo que se desea. ElYEAR() / WEEK()
enfoque propuesto inicialmente en esta respuesta tiene el efecto de dividir los datos agregados para esas semanas "transzonales" en dos: uno con el año anterior y otro con el año nuevo.Un corte limpio cada año, a costa de tener hasta dos semanas parciales, una en cada extremo, a menudo se desea en contabilidad, etc. y para eso el
YEAR() / WEEK()
enfoque es mejor.fuente
YEARWEEK()
da como resultado unINT(6)
que creo que será más rápido para ordenar / unirse / agrupar conLa respuesta aceptada anterior no me funcionó, porque ordenó las semanas por orden alfabético, no por orden cronológico:
Aquí está mi solución para contar y agrupar por semana:
SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, YEAR(date), WEEK(date), COUNT(*) FROM column_name GROUP BY week_name ORDER BY YEAR(DATE) ASC, WEEK(date) ASC
Genera:
fuente
ORDER BY date ASC
) también debería funcionarLo descubrí ... es un poco engorroso, pero aquí está.
Y, si las reglas de su negocio dicen que sus semanas comienzan los lunes, cambie
-1
a-2
.Editar
Han pasado los años y finalmente he podido escribir esto. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
fuente
Puede obtener el año y el número de semana concatenados (200945) utilizando la función YEARWEEK () . Si entiendo correctamente su objetivo, eso debería permitirle agrupar sus datos de varios años.
Si necesita la marca de tiempo real para el comienzo de la semana, es menos agradable:
Para los pedidos mensuales, podría considerar la función LAST_DAY () ; ordenar sería por el último día del mes, pero eso debería ser equivalente a ordenar por el primer día del mes ... ¿no es así?
fuente
Solo agregue esto en la selección:
Y
fuente
Si necesita la fecha de "fin de semana", también funcionará. Esto contará el número de registros de cada semana. Ejemplo: Si se crearon tres órdenes de trabajo entre (inclusive) 1/2/2010 y 1/8/2010 y se crearon 5 entre (inclusive) 1/9/2010 y 1/16/2010, esto devolvería:
3 1/8/2010
5 1/16/2010
Tuve que usar la función DATE () adicional para truncar mi campo de fecha y hora.
SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending FROM work_order wo GROUP BY week_ending;
fuente