给定偏移量的MySQL查询日期

给定偏移量的MySQL查询日期,mysql,sql,datetime,select,Mysql,Sql,Datetime,Select,在MySQL中,我有一个表节点\u weather: mysql> desc node_weather; +--------------------+--------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra

在MySQL中,我有一个表节点\u weather:

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我明白你的意思,每两小时把时间分组一次,但那似乎不起作用