找出1小时的时间戳和小时,日期,星期和月份之间的差距 - MySql

时间:2017-07-11 07:29:23

标签: mysql sql timestamp mysql-workbench

我有一个如下所示的查询:

SELECT count(*), date_format(created, '%H:%i - %d/%m/%y') as 
datecreated
FROM mimesi_realtime.served_clips
where created > NOW() - INTERVAL 48 HOUR
group by date_format(created, '%H - %d/%m/%y')
order by min(created) ASC;

它基本上计算了过去48小时内每小时的数量,并按时间顺序对结果进行排序

问题是在夜间,特别是在22:00到5:00之间没有注册数据,我需要每小时显示0的计数

count(*)位于左栏中 已创建是正确的

a)实际结果:

 - 261, 20:00 - 11/04/17
 - 133, 21:00 - 11/04/17
 - 208, 22:00 - 11/04/17 
 - 358, 5:00  - 12/04/17
 - 489, 6:00  - 12/04/17

b)预期结果:

 - 261, 20:00 - 11/04/17
 - 133, 21:00 - 11/04/17
 - 208, 22:00 - 11/04/17
 - 0,   23:00 - 11/04/17
 - 0,   24:00 - 11/04/17
 - 0,   1:00  - 12/04/17
 - 0,   2:00  - 12/04/17
 - 0,   3:00  - 12/04/17
 - 0,   4:00  - 12/04/17
 - 358, 5:00  - 12/04/17
 - 489, 6:00  - 12/04/17

我有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您问题的常用解决方案是创建一个日历表,其中包含您希望在报告中显示的所有时间戳。如果您无法创建表格,那么您可以使用内联方法,例如

(
    SELECT '2017-11-07 00:00:00' AS ts UNION ALL
    SELECT '2017-11-07 01:00:00'       UNION ALL
    ...
    SELECT '2017-11-07 23:00:00'
) t

然后将日历表连接到当前表并执行类似的查询:

SELECT
    COUNT(t2.created),
    DATE_FORMAT(t1.ts, '%H - %d/%m/%y') AS datecreated
FROM calendar t1    -- possibly replace with inline table
LEFT JOIN mimesi_realtime.served_clips t2
    ON DATE_FORMAT(t1.ts, '%H - %d/%m/%y') = DATE_FORMAT(t2.created, '%H - %d/%m/%y')
WHERE t1.ts > NOW() - INTERVAL 48 HOUR
GROUP BY DATE_FORMAT(t1.ts, '%H - %d/%m/%y')
ORDER BY MIN(t1.ts)

如果您不想使用日历表,那么另一个选项是使计划的进程每小时写一个虚拟记录。这样可以保证每个时间点都出现在您的表格中。它的缺点是浪费了一些空间和设置它所需的时间。