如何在MySQL中的特定日期每3个小时获取汇总结果?

时间:2018-08-19 13:08:14

标签: mysql

我有下表,并且我尝试每3小时获取一次产品总数,并且如果在一定时期内不存在任何产品,我想显示 0 而不是显示仅存在的记录。

enter image description here

我更接近并且能够每小时获取记录,但不是在3小时内。请找到我使用过的以下查询。

CREATE TABLE `integers` (
`i` int(11) NOT NULL,
 PRIMARY KEY (`i`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `integers`(`i`) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23);

SELECT hr + INTERVAL 1 HOUR AS `date`, COUNT(products.product_id) AS product_count
FROM (  
   SELECT 
     FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(CURRENT_TIMESTAMP)/3600)*3600+1800) - INTERVAL i HOUR AS hr
   FROM integers 
   WHERE i BETWEEN 0 AND HOUR(NOW())) AS times
LEFT OUTER JOIN product AS products 
ON products.`updated_on` >= hr
   AND products.`updated_on`  < hr + INTERVAL 1 HOUR
   AND products.`updated_on` > DATE(NOW())
GROUP 
BY hr
ORDER 
BY hr

通过上述查询,我​​能够获得每1小时的汇总结果,输出结果如下

enter image description here

但是我想每3小时进行一次。我在某处缺少某些东西,无法弄清楚。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情(使用 modulo 运算符):

SELECT hr.i as hr_from,
       hr.i + 3 as hr_to,
       COUNT(p.product_id) AS product_count
FROM integers hr
LEFT OUTER JOIN product AS p
ON p.updated_on >= DATE(NOW())
   AND HOUR(p.updated_on) BETWEEN hr.i and hr.i + 2
WHERE hr.i MOD 3 = 0
GROUP BY hr.i
ORDER BY hr.i