Rya*_*yan 6 mysql sql datetime date hour
我希望按小时收集计数。但并不是每个小时都出现在我的表中。
为确保数据始终包含空闲时间,我构建了一个小时表,其中包含 2000-2037 年的日期时间。我想我可以将LEFT JOIN数据表添加到此表中以跟踪丢失的时间。但我需要帮助这样做。
表:date_hour:
`hour`
2000-01-01 00:00:00
2000-01-01 01:00:00
...
2036-12-31 23:00:00
Run Code Online (Sandbox Code Playgroud)
表my_data:
log_date field1
2015-05-01 00:31:00 1000
2015-05-01 04:19:00 2000
2015-05-01 05:19:00 1000
2015-05-01 07:19:00 100
2015-05-01 07:35:00 6000
Run Code Online (Sandbox Code Playgroud)
想要的结果:
hour count
2015-05-01 00:00:00 1
2015-05-01 01:00:00 0
2015-05-01 02:00:00 0
2015-05-01 03:00:00 0
2015-05-01 04:00:00 1
2015-05-01 05:00:00 1
2015-05-01 06:00:00 0
2015-05-01 07:00:00 2
Run Code Online (Sandbox Code Playgroud)
MySQL尝试:
SELECT
dh.hour,
COUNT(md.*) AS count
FROM
date_hour dh
LEFT JOIN my_data md ON dh.hour = ????md.log_date????
WHERE
dh.hour >= '2015-05-01'
AND dh.hour < '2015-05-02'
GROUP BY
dh.hour
ORDER BY
dh.hour;
Run Code Online (Sandbox Code Playgroud)
完成这些计数的最有效方法是什么?假设每天有 100k-1MM 记录,目标是一次测量至少 30 天的数据。
可以DATE_FORMAT用来去除分钟和秒,如:
询问
SELECT
dh.hour,
COUNT(md.*) AS count
FROM
date_hour dh LEFT JOIN my_data md
ON dh.hour = DATE_FORMAT(md.log_date, "%Y-%m-%d %H:00:00")
WHERE
dh.hour >= '2015-05-01'
AND dh.hour < '2015-05-02'
GROUP BY
dh.hour
ORDER BY
dh.hour
;
Run Code Online (Sandbox Code Playgroud)
输出
+------------------------+-----------+
| hour | count |
+------------------------+-----------+
| 2015-05-01 00:00:00 | 1 |
| 2015-05-01 01:00:00 | 0 |
| 2015-05-01 02:00:00 | 0 |
| 2015-05-01 03:00:00 | 0 |
| 2015-05-01 04:00:00 | 1 |
| 2015-05-01 05:00:00 | 1 |
| 2015-05-01 06:00:00 | 0 |
| 2015-05-01 07:00:00 | 2 |
| ... trailing hours ... | allzeroes |
+------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)
2015-05-01 08:00:00 之后的所有内容都是零( my_data 中没有数据)