#mysql #datetime #date-arithmetic
#mysql #datetime #дата-арифметика
Вопрос:
Я пытаюсь написать запрос, который вернет данные, сгруппированные по диапазонам дат, и мне интересно, есть ли способ сделать это в одном запросе (включая вычисление), или мне нужно написать три отдельных запроса? Даты в моей таблице хранятся как временные метки 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:
Это должно работать:
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
столбце.