MySQL: получать «самый загруженный» или «самый популярный» час из поля даты и времени? - PullRequest
4 голосов
/ 18 марта 2010

Рассмотрим следующую таблицу, в которой есть поля - id (int) и date_created (datetime):

id       date_created

 1       2010-02-25 12:25:32
 2       2010-02-26 13:40:37
 3       2010-03-01 12:02:22
 4       2010-03-01 12:10:23
 5       2010-03-02 10:10:09
 6       2010-03-03 12:45:03

Я хочу знать самый загруженный / самый популярный час дня для этого набора данных. В этом примере результат, который я ищу, будет 12.

Идеи

Ответы [ 5 ]

7 голосов
/ 18 марта 2010

Чтобы получить самый популярный час, используйте этот запрос

select date_format( date_created, '%H' ) as `hour`
  from [Table]
 group by date_format( date_created, '%H' )
 order by count(*) desc
 limit 1;

Если вы хотите посмотреть все данные, перейдите с этим

select count(*) as num_records
     , date_created
     , date_format( date_created, '%H' ) as `hour`
  from [Table]
 group by `hour`
 order by num_records desc;
3 голосов
/ 18 марта 2010

Если вы хотите что-то более гибкое, например, до получаса или четверти часа, вы можете сделать следующее:

SELECT floor(time_to_sec(date_created)/3600),count(*) AS period 
FROM table GROUP BY period ORDER BY c DESC

Если вы хотите самый популярный 2-часовой интервал, используйте 7200. Самый популярный 15-минутный интервал - 900. Вам просто нужно помнить, что вы имеете дело с секундами (3600 секунд в часе).

2 голосов
/ 18 марта 2010

Мне нравятся ответы как Саймона, так и Питера, но я не могу выбрать оба варианта как принятые. Я соединил 2, чтобы сделать более чистый запрос, который возвращал только популярный час (мне не нужны цифры).

SELECT hour(date_created) AS h 
FROM my_table 
GROUP BY h 
ORDER BY count(*) DESC 
LIMIT 1
2 голосов
/ 18 марта 2010

Используйте функцию hour() для извлечения часа, затем выполните обычное агрегирование:

SELECT count(hour(date_created)) AS c, hour(date_created) AS h FROM table GROUP BY h ORDER BY c DESC;

0 голосов
/ 18 марта 2010

Вы можете попробовать это:

SELECT 
  DATE_FORMAT(date,'%H') as hours, 
  count(*) as count 
FROM 
  myTable 
GROUP BY 
  hours 
ORDER BY 
  count DESC
...