PostgreSQL中TEXT转TIMESTAMP及BETWEEN查询报错问题
解决PostgreSQL中TEXT类型日期用BETWEEN查询的报错问题
这个错误的根源很直白:你的entry_date列是TEXT类型,但你在查询里把比较值转换成了timestamp类型,PostgreSQL没有定义text >= timestamp这类跨类型比较的运算符,所以直接报错了。下面给你两种可行的解决方案:
方案一:修改视图,将TEXT列转为timestamp类型(推荐长期使用)
既然视图里的日期本来就是标准时间戳格式,不如直接在视图定义里把它转换成timestamp类型,这样后续所有查询都不用再重复转换,还能彻底避免类型不匹配的问题。
执行类似这样的语句重新创建视图:
CREATE OR REPLACE VIEW v_view AS SELECT id, -- 注意匹配你的日期格式:日/月/年 小时:分钟 to_timestamp(entry_date, 'DD/MM/YYYY HH24:MI')::timestamp AS entry_date FROM 你的原表名称;
之后再执行你原本的查询(记得修正之前的笔误:entrada应该是entry_date),就能正常运行了。
方案二:查询时临时转换TEXT列的类型(临时应急方案)
如果暂时没办法修改视图,那就在WHERE子句里先把TEXT类型的entry_date转换成timestamp,让两边比较的类型保持一致:
SELECT id, entry_date FROM v_view WHERE to_timestamp(entry_date, 'DD/MM/YYYY HH24:MI')::timestamp BETWEEN to_timestamp('20/03/2018 00:00','DD/MM/YYYY HH24:MI')::timestamp AND to_timestamp('22/03/2018 00:00','DD/MM/YYYY HH24:MI')::timestamp ORDER BY to_timestamp(entry_date, 'DD/MM/YYYY HH24:MI')::timestamp;
⚠️ 重要提醒:不要直接用TEXT字符串做日期比较!比如直接写entry_date BETWEEN '20/03/2018 00:00' AND '22/03/2018 00:00',这种字符串比较是按字典序来的,会出现逻辑错误(比如'31/12/2023'会被认为比'01/01/2024'大)。
另外提一句:你原查询里写的是WHERE entrada BETWEEN,但列名是entry_date,这应该是笔误,记得修正,不然会报找不到列的错误。
内容的提问来源于stack exchange,提问作者Afsrd3
相关产品推荐
相关产品推荐

