Pregunta

¿Es posible hacer que una simple consulta para contar el número de registros que tengo en un período determinado de tiempo, como un año, mes y día, tener un campo TIMESTAMP, como:

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

O incluso:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

Para tener una estadística mensual.

Gracias!

¿Fue útil?

Solución

GROUP BY YEAR(record_date), MONTH(record_date)

Salida de la fecha rel="noreferrer"> en MySQL.

Otros consejos

GROUP BY DATE_FORMAT(record_date, '%Y%m')

Nota: (principalmente, a downvoters potenciales). En la actualidad, esto puede no ser tan eficaz como otras sugerencias. Aún así, lo dejo como una alternativa, y, también, que puede servir en ver cómo otras soluciones más rápido son. (Para que no se puede decir rápido de lento hasta que vea la diferencia.) Además, con el paso del tiempo, los cambios se podrían hacer al motor de MySQL con respecto a la optimización a fin de que esta solución, a algunos (tal vez, no tan distante) punto en el futuro, para llegar a ser bastante comparable en eficacia con la mayoría de los otros.

He intentado utilizar la declaración 'dónde' anterior, pensé que su correcta ya que nadie lo corrigió pero estaba equivocado; después de algunas búsquedas descubrí que esta es la fórmula correcta para la instrucción WHERE por lo que el código se convierte de esta manera:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

intente éste

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT (unidad DE fecha) función es mejor como menos agrupación se utiliza y la función devuelve un valor del número.

condición de comparación al agrupar será más rápido que la función DATE_FORMAT (que devuelve un valor de cadena). Trate de usar la función | campo que el valor de retorno no sea una cadena de condición de comparación de SQL (WHERE, HAVING, ORDER BY, GROUP BY)

.

Si su búsqueda ha terminado varios años, y todavía se desean agrupar mensual, sugiero:

versión # 1:

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

versión # 2 (más eficiente) :

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

He comparado estas versiones sobre una mesa grande con 1,357,918 filas ( innodb), y la segunda versión parece tener mejores resultados.

version1 (promedio de 10 ejecuta) : 1.404 segundos
version2 (promedio de 10 ejecuta) : 0.780 segundos

(SQL_NO_CACHE clave añadió para evitar MySQL de almacenamiento en caché para consultas.)

Si desea agrupar por fecha en MySQL a continuación, utilizar el código de abajo:

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

Espero que esto ahorra algo de tiempo para los que se van a encontrar este hilo.

Si desea filtrar los registros para un año en particular (por ejemplo, 2000) y luego optimizar la WHERE cláusula de la siguiente manera:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

En lugar de:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

Los resultados se generaron contra una tabla que contiene 300k filas y índice en la columna fecha.

En cuanto a la GROUP BY cláusula, he probado las tres variantes en contra de la tabla mencionada anteriormente; aquí están los resultados:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

El último es el ganador.

Una solución completa y sencilla con la realización de manera similar aún más corto y alternativa más flexible actualmente activa:

SELECT COUNT(*) FROM stats
-- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')

Si desea obtener una estadística mensuales con recuentos de filas al mes de cada año ordenado por último mes, a continuación, intente lo siguiente:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC

Puede hacer esto simplemente Mysql DATE_FORMAT () función en GROUP BY. Es posible que desee añadir una columna adicional para mayor claridad en algunos casos, como en los registros abarcan varios años, entonces mismo mes se produce en diferentes years.Here tantos opción puede personalizar esto. Por favor, lea este acaben de comenzar. Espero que debería ser muy útil para usted. Aquí es consulta de ejemplo por su comprensión

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR,

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');

La siguiente consulta trabajó para mí en la base de datos Oracle 12c Release 12.1.0.1.0

SELECT COUNT(*)
FROM stats
GROUP BY 
extract(MONTH FROM TIMESTAMP),
extract(MONTH FROM TIMESTAMP),
extract(YEAR  FROM TIMESTAMP);

Yo prefiero a optimizar la selección un año se agrupan de esta manera:

SELECT COUNT(*)
  FROM stats
 WHERE record_date >= :year 
   AND record_date <  :year + INTERVAL 1 YEAR;

De esta manera sólo se puede obligar a la vez en el año, por ejemplo, '2009', con un parámetro llamado y no tiene que preocuparse acerca de la adición '-01-01' o pasando en '2010' por separado.

Además, como presumiblemente sólo estamos contando filas y id nunca es NULL, prefiero COUNT(*) a COUNT(id).

.... group by to_char(date, 'YYYY') -> 1989

.... group by to_char(date,'MM') -> 05

.... group by to_char(date,'DD') ---> 23

.... group by to_char(date,'MON') ---> MAYO

.... group by to_char(date,'YY') ---> 89

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top