这种数据格式,数据库应该如何根据时间段查询?

2018-10-14 22:56:12 +08:00
 maitiantuzi

举个例子,一个温度传感器,当温度有变化的时候才上传数据,数据示例如下:

data_value-------create_time
20 ------------- 2018-09-09 13:05:00
22 ------------- 2018-09-09 13:15:00
26 ------------- 2018-09-09 13:30:00
21 ------------- 2018-09-09 14:10:00

现在想查询 13:10:00 ~ 13:20:00 之间的数据,由数据可知这个区间的值为 10 和 22, 但是 sql 该如何写好呢?

ps:目前数据库为 mysql,下一步会迁移到 mongodb

1831 次点击
所在节点    问与答
7 条回复
kslr
2018-10-14 23:21:20 +08:00
where >= 啊,mysql 还没写溜,mongdb 你玩的转吗
maitiantuzi
2018-10-14 23:29:08 +08:00
@kslr 你说的是 where create_time >= 2018-09-09 13:10:00 and create_time <= 13:10:00 13:20:00 吗?
这样只能查出 22 ------------- 2018-09-09 13:15:00 这条数据,实际上结果应该为 20,22,因为 2018-09-09 13:05:00 ~ 2018-09-09 13:15:00 之间的数据都是 20
kslr
2018-10-14 23:37:24 +08:00
@maitiantuzi 我不是太明白,你要查询 10 ~ 20 秒之间的数据。
但是 20 在 05 秒,22 是 15 秒,错误在哪里
qiayue
2018-10-14 23:44:36 +08:00
需求没描述清楚,你是想查询一个时间段内的所有数据,还是只想知道最小值和最大值?
newtype0092
2018-10-14 23:54:40 +08:00
@kslr 意思是 13:15:00 的数据是 22, 但 13:14:59 的数据还是 20。

@maitiantuzi 你这个明显是自己存的数据不足啊,你要查 13:10:00 的数据,却要依靠前一条 13:05:00 的数据才能得到完整的信息,明显表设计的有问题啊。

你要用这种时间段的话,就应该明确每一段的开始时间和结束时间,比如说把 create_time 改成 start_time 和 end_time,温度变化时,上一条数据的 end_time 更新为当前 time-1,然后新建一条数据,start_time 是当前 time,end_time 是 null。
如果不改表结构,也可以多插一条数据标记结束时间,插入(22, 2018-09-09 13:15:00)之前,多插入一条(20, 2018-09-09 13:14:59)。
XiaoxiaoPu
2018-10-14 23:58:51 +08:00
感觉需要 2 个 sql,第一个 where create_time <= 2018-09-09 13:10:00 order by create_time desc limit1,第二个 where create_time > 2018-09-09 13:10:00 and create_time <= 2018-09-09 13:20:00
qiayue
2018-10-15 00:02:31 +08:00
时序数据库了解一下
专门用于存储你这种数据的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX