MySql查询 - 按日期范围分组?

时间:2011-11-03 15:16:37

标签: mysql datetime date-arithmetic

我正在尝试编写一个返回按日期范围分组的数据的查询,并且想知道是否有办法在一个查询中进行(包括计算),或者我是否需要编写三个单独的查询?我表中的日期存储为unix时间戳。

例如,我的记录如下:

id  type    timestamp
312 87  1299218991
313 87  1299299232
314 90  1299337639
315 87  1299344130
316 87  1299348977
497 343 1304280210
498 343 1304280392
499 343 1304280725
500 343 1304280856
501 343 1304281015
502 343 1304281200
503 343 1304281287
504 343 1304281447
505 343 1304281874
566 90  1305222137
567 343 1305250276
568 343 1305387869
569 343 1305401114
570 343 1305405062
571 343 1305415659
573 343 1305421418
574 343 1305431457
575 90  1305431756
576 343 1305432456
577 259 1305441833
578 259 1305442234
580 343 1305456152
581 343 1305467261
582 343 1305483902

我正在尝试编写一个查询,该查询将查找“创建”日期之间的所有记录:

  1. 2011-05-01和2011-06-01(月)
  2. 2011-03-01和2011-06-01(季度)
  3. 2010-05-01和2011-06-01(年)
  4. 我尝试了以下内容(在这种情况下,我在一个月内硬编码了unix值,看看我是否能让它工作......):

    SELECT COUNT(id) AS idCount,
    MIN(FROM_UNIXTIME(timestamp)) AS fromValue, 
    MAX(FROM_UNIXTIME(timestamp)) AS toValue
    FROM uc_items 
    WHERE ADDDATE(FROM_UNIXTIME(timestamp), INTERVAL 1 MONTH) 
          >= FROM_UNIXTIME(1304233200)
    

    但是,它似乎没有用,因为fromValue是:2011-04-02 21:12:56而toValue是2011-10-25 06:20:14,显然,这不是一个日期为2011年5月1日至2011年6月1日。

1 个答案:

答案 0 :(得分:2)

这很有用:

SELECT COUNT(id) AS idCount,
   FROM_UNIXTIME(MIN(timestamp)) AS fromValue, 
   FROM_UNIXTIME(MAX(timestamp)) AS toValue
FROM uc_items
WHERE timestamp BETWEEN UNIX_TIMESTAMP('2011-05-01') AND UNIX_TIMESTAMP('2011-06-01 23:59:59')

此外,作为性能提示 - 避免在WHERE子句中将函数应用于表中的列(例如,您有WHERE ADDDATE(FROM_UNIXTIME(timestamp)))。这样做会阻止MySQL使用timestamp列上的任何索引。