MySQL: записи вставлены по часам за последние 24 часа - PullRequest
4 голосов
/ 06 мая 2010

Я пытаюсь перечислить количество записей в час, вставленных в базу данных за последние 24 часа. В каждой строке отображаются записи, вставленные в тот час, а также сколько часов назад это было.

Вот мой запрос:

SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY time ASC

сейчас возвращается:

28  23
62  23
14  20
1    4
28  3
19  1

Это показывает две строки из 23 часов назад, когда он должен показывать только одну в час. Я думаю, что это как-то связано с использованием NOW () вместо получения времени в начале часа, которое я не уверен в том, как его получить.

Должен быть более простой способ сделать это.

1 Ответ

3 голосов
/ 06 мая 2010

Если вы сгруппировали по HOUR(time), то в выражениях выбора следует использовать HOUR(time), а не time. Например:

SELECT HOUR(time), COUNT(*)
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY HOUR(time)

В качестве альтернативы вы можете группировать по выражению, которое хотите вернуть:

SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
ORDER BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )

В случае, если вам интересно, можно безопасно вызывать NOW() несколько раз в одном и том же запросе, как этот. Из руководства :

Функции, которые возвращают текущую дату или время, каждая оценивается только один раз для запроса в начале выполнения запроса. Это означает, что несколько ссылок на такую ​​функцию, как NOW () в одном запросе, всегда приводят к одному и тому же результату.

...