MySQL Query GROUP BY day / month / year

前端 未结 14 2358
野趣味
野趣味 2020-11-22 06:37

Is it possible to make a simple query to count how many records I have in a determined period of time like a year, month, or day, having a TIMESTAMP field, like

相关标签:
14条回答
  • 2020-11-22 07:02

    try this one

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

    EXTRACT(unit FROM date) function is better as less grouping is used and the function return a number value.

    Comparison condition when grouping will be faster than DATE_FORMAT function (which return a string value). Try using function|field that return non-string value for SQL comparison condition (WHERE, HAVING, ORDER BY, GROUP BY).

    0 讨论(0)
  • 2020-11-22 07:05

    The following query worked for me in Oracle Database 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);
    
    0 讨论(0)
  • 2020-11-22 07:08
    GROUP BY DATE_FORMAT(record_date, '%Y%m')

    Note (primarily, to potential downvoters). Presently, this may not be as efficient as other suggestions. Still, I leave it as an alternative, and a one, too, that can serve in seeing how faster other solutions are. (For you can't really tell fast from slow until you see the difference.) Also, as time goes on, changes could be made to MySQL's engine with regard to optimisation so as to make this solution, at some (perhaps, not so distant) point in future, to become quite comparable in efficiency with most others.

    0 讨论(0)
  • 2020-11-22 07:09

    You can do this simply Mysql DATE_FORMAT() function in GROUP BY. You may want to add an extra column for added clarity in some cases such as where records span several years then same month occurs in different years.Here so many option you can customize this. Please read this befor starting. Hope it should be very helpful for you. Here is sample query for your understanding

    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 ');
    
    0 讨论(0)
  • 2020-11-22 07:10

    If your search is over several years, and you still want to group monthly, I suggest:

    version #1:

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

    version #2 (more efficient):

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

    I compared these versions on a big table with 1,357,918 rows (innodb), and the 2nd version appears to have better results.

    version1 (average of 10 executes): 1.404 seconds
    version2 (average of 10 executes): 0.780 seconds

    (SQL_NO_CACHE key added to prevent MySQL from CACHING to queries.)

    0 讨论(0)
  • 2020-11-22 07:12

    If you want to filter records for a particular year (e.g. 2000) then optimize the WHERE clause like this:

    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.
    

    Instead of:

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

    The results were generated against a table containing 300k rows and index on date column.

    As for the GROUP BY clause, I tested the three variants against the above mentioned table; here are the results:

    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.
    

    The last one is the winner.

    0 讨论(0)
提交回复
热议问题