如何在Elasticsearch中精准查询上月完整数据?
获取Elasticsearch上月完整数据的正确日期范围查询
嘿,我之前也踩过这个坑!你说得完全对,只设置gte的话,查询会包含从上个月第一天到当前时刻的所有数据,必须加上lte来锁定上个月的最后一刻才行。
正确的lte表达式写法
你可以用Elasticsearch的日期数学表达式来精准定位上个月的最后一天的最后一毫秒:now-1M/M+1M-1ms
表达式逻辑拆解
咱们来拆解一下这个表达式的意思,方便你理解:
now-1M/M:先把当前时间回退1个月,然后对齐到当月的第一天00:00:00(比如今天是2019年8月9日,这部分就会得到2019-07-01T00:00:00Z)+1M:给这个日期加上1个月,就得到了当前月的第一天00:00:00(也就是2019-08-01T00:00:00Z)-1ms:最后减去1毫秒,就刚好得到上个月最后一天的23:59:59.999(2019-07-31T23:59:59.999Z)
完整的查询语句
把这个lte参数加到你的查询里,最终的JSON就是这样:
{ "size": 0, "query": { "range": { "date": { "gte": "now+1m-1M/M", "lte": "now-1M/M+1M-1ms", "time_zone": "+00:00" } } } }
小验证
不管你是在上月的中旬还是月底执行这个查询,它都能精准匹配上个月的完整日期范围:
- 如果今天是2019年7月1日,
gte会是2019-06-01T00:00:00Z,lte会是2019-06-30T23:59:59.999Z - 如果今天是2019年7月31日,
gte是2019-07-01T00:00:00Z,lte是2019-07-31T23:59:59.999Z
这样就能完美获取上个月的全部数据啦!
内容的提问来源于stack exchange,提问作者FlyingBurger
相关产品推荐
相关产品推荐

