首页 文章

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

提问于
浏览
0

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

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

  • 2011-05-01和2011-06-01(月)

  • 2011-03-01和2011-06-01(季度)

  • 2010-05-01和2011-06-01(年)

我尝试了以下(在这种情况下,我硬编码了一个月的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,这显然不是5之间的日期/ 1/2011和6/1/2011 .

1 回答

  • 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 列上的任何索引 .

相关问题