title: MySQL Group By Hours
body: <p>I'm trying to get a report from my history table by hourly usage. <code>history</code> table is;</p>
  
  <pre><code>CREATE TABLE IF NOT EXISTS `history` (
  `history_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) unsigned NOT NULL DEFAULT '0',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`history_id`),
  KEY `user_id` (`user_id`),
  KEY `created` (`created`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
  </code></pre>
  
  <p>I want to group by <code>HOUR</code> and <code>COUNT</code> all records in a given date range.</p>
  
  <pre><code>Hours            |    Usage
  ------------------------------------
  00:00-01:00      |      5
  01:00-02:00      |      9
  02:00-03:00      |      0 (or NULL)
  03:00-04:00      |      20
  ...
  ...
  ...
  22:00-23:00      |      11
  23:00-00:00      |      1
  </code></pre>
  
  <p>I used a query something like this but it doesn't display all hours.</p>
  
  <pre><code>SELECT 
  
  CASE 
    WHEN HOUR(created) BETWEEN 0 AND 1 THEN '00:00 - 01:00'
    WHEN HOUR(created) BETWEEN 1 AND 2 THEN '01:00 - 02:00'
    WHEN HOUR(created) BETWEEN 2 AND 3 THEN '02:00 - 03:00'
    WHEN HOUR(created) BETWEEN 3 AND 4 THEN '03:00 - 04:00'
    WHEN HOUR(created) BETWEEN 4 AND 5 THEN '04:00 - 05:00'
    WHEN HOUR(created) BETWEEN 5 AND 6 THEN '05:00 - 06:00'
    WHEN HOUR(created) BETWEEN 6 AND 7 THEN '06:00 - 07:00'
    WHEN HOUR(created) BETWEEN 7 AND 8 THEN '07:00 - 08:00'
    WHEN HOUR(created) BETWEEN 8 AND 9 THEN '08:00 - 09:00'
    WHEN HOUR(created) BETWEEN 9 AND 10 THEN '09:00 - 10:00'
    WHEN HOUR(created) BETWEEN 10 AND 11 THEN '10:00 - 11:00'
    WHEN HOUR(created) BETWEEN 11 AND 12 THEN '11:00 - 12:00'
    WHEN HOUR(created) BETWEEN 12 AND 13 THEN '12:00 - 13:00'
    WHEN HOUR(created) BETWEEN 13 AND 14 THEN '13:00 - 14:00'
    WHEN HOUR(created) BETWEEN 14 AND 15 THEN '14:00 - 15:00'
    WHEN HOUR(created) BETWEEN 15 AND 16 THEN '15:00 - 16:00'
    WHEN HOUR(created) BETWEEN 16 AND 17 THEN '16:00 - 17:00'
    WHEN HOUR(created) BETWEEN 17 AND 18 THEN '17:00 - 18:00'
    WHEN HOUR(created) BETWEEN 18 AND 19 THEN '18:00 - 19:00'
    WHEN HOUR(created) BETWEEN 19 AND 20 THEN '19:00 - 20:00'
    WHEN HOUR(created) BETWEEN 20 AND 21 THEN '20:00 - 21:00'
    WHEN HOUR(created) BETWEEN 21 AND 22 THEN '21:00 - 23:00'
    WHEN HOUR(created) BETWEEN 22 AND 23 THEN '22:00 - 23:00'
    WHEN HOUR(created) BETWEEN 23 AND 24 THEN '23:00 - 00:00'
  END AS `Hours`,
  
  COUNT(*) AS `usage`
  FROM history
  WHERE (created BETWEEN '2012-02-07' AND NOW())
  GROUP BY 
    CASE 
      WHEN HOUR(created) BETWEEN 0 AND 1 THEN 1
      WHEN HOUR(created) BETWEEN 1 AND 2 THEN 2
      WHEN HOUR(created) BETWEEN 2 AND 3 THEN 3
      WHEN HOUR(created) BETWEEN 3 AND 4 THEN 4
      WHEN HOUR(created) BETWEEN 4 AND 5 THEN 5
      WHEN HOUR(created) BETWEEN 5 AND 6 THEN 6
      WHEN HOUR(created) BETWEEN 6 AND 7 THEN 7
      WHEN HOUR(created) BETWEEN 7 AND 8 THEN 8
      WHEN HOUR(created) BETWEEN 8 AND 9 THEN 9
      WHEN HOUR(created) BETWEEN 9 AND 10 THEN 10
      WHEN HOUR(created) BETWEEN 10 AND 11 THEN 11
      WHEN HOUR(created) BETWEEN 11 AND 12 THEN 12
      WHEN HOUR(created) BETWEEN 12 AND 13 THEN 13
      WHEN HOUR(created) BETWEEN 13 AND 14 THEN 14
      WHEN HOUR(created) BETWEEN 14 AND 15 THEN 15
      WHEN HOUR(created) BETWEEN 15 AND 16 THEN 16
      WHEN HOUR(created) BETWEEN 16 AND 17 THEN 17
      WHEN HOUR(created) BETWEEN 17 AND 18 THEN 18
      WHEN HOUR(created) BETWEEN 18 AND 19 THEN 19
      WHEN HOUR(created) BETWEEN 19 AND 20 THEN 20
      WHEN HOUR(created) BETWEEN 20 AND 21 THEN 21
      WHEN HOUR(created) BETWEEN 21 AND 22 THEN 22
      WHEN HOUR(created) BETWEEN 22 AND 23 THEN 23
      WHEN HOUR(created) BETWEEN 23 AND 24 THEN 24
  END
  </code></pre>
  
  <p>It displays only if there are any records.</p>
  
  <pre><code>Hours            |    Usage
  ------------------------------------
  00:00-01:00      |      5
  01:00-02:00      |      9
  23:00-00:00      |      1
  </code></pre>