BETWEEN与LIKE组合语法报错求助:PostgreSQL日期范围查询问题
解决带时区时间戳的日期范围查询SQL错误
错误原因
你的SQL语句存在语法错误:BETWEEN 运算符的两端不能搭配 LIKE 使用,LIKE 是字符串匹配运算符,不能作为BETWEEN的边界值,这直接触发了"type 'like' does not exist"的报错。
正确解决方案
针对带时区时间戳(timestamptz类型)的日期范围查询,推荐直接操作时间类型而非转换为字符串,以下是两种高效的实现方式:
方式1:精确时间区间匹配(推荐)
通过指定当天的起始和结束时间戳来匹配,能利用索引,效率最高:
SELECT * FROM aqua.reading WHERE pres_date >= '2022-10-18T00:00:00+00:00'::timestamptz AND pres_date < '2022-10-19T00:00:00+00:00'::timestamptz;
注:可根据你的时区调整时间偏移(比如+08:00代表东八区),或直接使用不带时区的日期字符串,数据库会自动根据会话时区转换。
方式2:使用日期函数提取日期
如果只需要匹配日期部分,可以用DATE()函数提取timestamptz的日期:
SELECT * FROM aqua.reading WHERE DATE(pres_date) = '2022-10-18';
不推荐的字符串匹配方式(仅作参考)
如果一定要通过字符串匹配实现(会丢失索引优化,效率低),正确写法是直接用LIKE,不需要BETWEEN:
SELECT * FROM aqua.reading WHERE CAST(pres_date AS VARCHAR) LIKE '2022-10-18%';
内容的提问来源于stack exchange,提问作者Vanz
相关产品推荐
相关产品推荐

