MySql запрос - Группировка по диапазонам дат? - PullRequest
0 голосов
/ 03 ноября 2011

Я пытаюсь написать запрос, который будет возвращать данные, сгруппированные по диапазонам дат, и мне интересно, есть ли способ сделать это в одном запросе (включая вычисления), или мне нужно написать три отдельных?Даты в моей таблице хранятся как метки времени 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 (год)

Я попробовал следующее (в этом случае я жестко закодировал значение 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, что, очевидно, не дата между 01.05.2011 и 06.01.2011.

1 Ответ

2 голосов
/ 03 ноября 2011

Это должно сработать:

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.

...