查找1小时的时间戳与按小时、日期、周和月分组之间的差距-MySql

查找1小时的时间戳与按小时、日期、周和月分组之间的差距-MySql,mysql,sql,timestamp,mysql-workbench,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小时内

我有一个如下的查询:

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

计数(*)位于左栏
创建的是正确的

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

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

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

(
    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)

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

如果您选择了某个内容,则通常必须按该内容分组。为了得到进一步的帮助,我们昨天解决了这个问题,是吗@埃斯特班普。我们只做了几天几个月。但我尝试了几个小时和几个星期,但没有成功work@Strawberry我不太明白你想说什么,你能重复一遍吗?你选择x,但你按y分组。X和y必须是sameYeah,我曾想过,但问题是我不能修改数据库,但我只能运行queries@GPecchio没问题。您可以使用一个内联日历表,您的代码将为感兴趣的时间段生成该表。内联表是否可以是动态的,因为我需要过去48小时的数据?是的,这就是我的想法。您可以使用动态SQL来实现这一点。只要搜索SO,您就会找到这样的代码。