Gemfire中如何忽略时间时区查询long类型timestamp对应日期数据
错误原因分析
timestamp是Gemfire OQL的保留关键字,直接作为字段名使用会被识别为语法标记触发报错,需要用双引号包裹标识为自定义字段。- 函数名书写错误,
to date缺少下划线,正确函数名为to_date;且日期参数需要用单引号包裹,格式需符合yyyy-MM-dd规范,你示例中的2021-21-19月份值非法。 - 直接对转义后的日期做等值匹配无法实现忽略时间的需求,
to_date转换long字段后会保留时分秒信息,和输入的日期直接相等只能匹配到当天0点0分0秒的记录。
最优解决方案:时间戳范围查询(推荐,性能最优)
直接基于long类型的timestamp字段做数值范围匹配,无需类型转换,可命中字段索引,查询效率最高:
- 先在业务代码中计算输入日期对应的当天0点的毫秒时间戳和次日0点的毫秒时间戳,注意统一时区处理避免偏差。
- 编写OQL如下:
select * from /employee where "timestamp" >= $1 and "timestamp" < $2
其中$1为输入日期当天0点的long型时间戳,$2为输入日期次日0点的long型时间戳。
日期函数查询方案(适合小数据量场景)
如果必须在OQL中完成日期转换逻辑,写法如下:
select * from /employee where to_char(to_date("timestamp"), 'yyyy-MM-dd') = '2021-11-19'
逻辑说明:
- 先用
to_date将long类型的时间戳转为日期对象 - 再用
to_char格式化为仅保留年月日的字符串,和输入的日期字符串做等值匹配 - 注意
timestamp必须用双引号包裹避免关键字冲突
内容的提问来源于stack exchange,提问作者JustLift
相关产品推荐
相关产品推荐

