如何在CosmosDB SQL查询中基于Unix时间戳过滤Timestamp字段?
处理CosmosDB SQL中Unix时间戳的过滤问题
我看你已经在搭建CosmosDB的SQL查询来筛选特定变量的时间戳数据了,这里帮你完善查询并梳理关键注意点:
首先你的基础查询结构已经没问题,针对Unix时间戳的过滤需要留意几个细节:
- 确保时间戳的比较是数值类型的精确匹配:如果CosmosDB里
"$date"存储的是秒级Unix时间戳,直接用数值比较就生效;如果是毫秒级,要保证比较值的单位和存储值一致。 - 时间戳条件可以写得更明确,比如你用到的
1523270312是秒级时间戳,直接放在条件里就能筛选该时间点之后的数据。
完善后的完整查询语句
SELECT root._id as hpid, root.FirstConnected["$date"] as FirstConnected, root.LastUpdated["$date"] as LastUpdated, var._id as varid, var.Values[0].Timestamp["$date"] as TimeStamp, var.Values[0]["Value"] as Val FROM root JOIN var IN root.Variables WHERE var._id IN (99998,99999) AND var.Values[0].Timestamp["$date"] >= 1523270312 -- 替换为你需要的目标时间戳即可
额外实用提示
- 如果你的
Timestamp["$date"]是毫秒级Unix时间戳(比如1523270312000),一定要把比较值也转成毫秒级,不然会出现筛选结果不符合预期的情况。 - 如果习惯用ISO格式日期(比如
2018-04-09T00:00:00Z)来指定时间范围,可以用CosmosDB内置的UnixTimeStamp()函数转换后再比较:-- 示例:将ISO日期转为秒级时间戳做过滤 AND var.Values[0].Timestamp["$date"] >= UnixTimeStamp("2018-04-09T00:00:00Z") - 你当前用
var.Values[0]取的是数组第一个元素,如果需要筛选数组中任意符合时间条件的元素,得调整JOIN逻辑,比如改成JOIN val IN var.Values,再针对val.Timestamp["$date"]设置过滤条件。
内容的提问来源于stack exchange,提问作者baatchen
相关产品推荐
相关产品推荐

