给定偏移量的MySQL查询日期
在MySQL中,我有一个表节点\u weather:给定偏移量的MySQL查询日期,mysql,sql,datetime,select,Mysql,Sql,Datetime,Select,在MySQL中,我有一个表节点\u weather: mysql> desc node_weather; +--------------------+--------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra
mysql> desc node_weather;
+--------------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+-------------------+-----------------------------+
| W_id | mediumint(9) | NO | PRI | NULL | auto_increment |
| temperature | int(10) | YES | | NULL | |
| humidity | int(10) | YES | | NULL | |
| time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
现在我需要做的是:每天每两个小时00:00:00,02:00:00,…,24:00:00,我想测一次体温。通常情况下,查询可能是这样的:
mysql> SELECT temperature
-> FROM node_weather
-> WHERE date(time) = DATE(NOW())
-> AND TIME(time) IN ('00:00:00','02:00:00','04:00:00','06:00:00','08:00:00','10:00:00','12:00:00','14:00:00','16:00:00','18:00:00','20:00:00','22:00:00','24:00:00');
在理想的情况下,我应该得到一个结果,选择12行,一切都会很好。但它有两个问题:
该表不包括全天的数据,因此,例如,缺少“24:00:00”时间的温度。在这种情况下,我希望返回NULL。
该表有时记录带有时间戳的数据,如“10:00:02”或“09:59:58”,但不记录“10:00:00”。为了解决这种情况,我想将偏移量添加到表达式中的所有值中,类似于“10:00:00”-偏移量,“10:00:00”+偏移量,它将始终只选择一个值,而不管该范围中的哪个值。
我知道这有点糟糕,但这正是我老板想要的。谢谢你的帮助 好的,比我在评论中写的要精确一点: 编辑:有一个错误。希望这不会发生
SELECT
time,
deviation,
hour,
temperature
FROM (
SELECT
time,
ROUND(HOUR(time) / 2) * 2 AS hour,
IF(HOUR(time) % 2,
3600 - MINUTE(time) * 60 - SECOND(time),
MINUTE(time) * 60 + SECOND(time)
) AS deviation,
temperature
FROM node_weather
WHERE DATE(time) = DATE(NOW())
ORDER BY deviation ASC
) t
GROUP BY hour
ORDER BY
hour ASC
基本上,将09:00:00-10:59:59这样的时间间隔按小时/2四舍五入进行分组,然后按这些时间间隔进行升序排序,在时间间隔内按到时间间隔中心的距离进行排序,因此我们选择10:00:00而不是09:00:00或10:59:59。按时间/7200四舍五入进行分组是否有帮助?我可以知道你的想法吗?简单地说就可以了。24:00:00代表什么时间?它通常不是有效时间,因为它与第二天的00:00:00相同。@JoachimIsaksson您完全正确,因此我将从表达式中删除最后一个值,但这并不能解决我的问题unfortunately@Amadan我明白你的意思,每两小时把时间分组一次,但那似乎不起作用