如何过滤负Interval值?比较操作报错且无法修改列类型
解决PostgreSQL中Interval类型无法与0比较的问题
错误原因
PostgreSQL没有定义interval类型与整数0之间的比较运算符,所以直接写ride_length < 0会触发类型不匹配的错误。
两种可行解决方案
方案1:直接比较原始时间戳列(推荐,性能更优)
跳过提前计算ride_length的步骤,直接通过原始的started_at和ended_at判断正负,无需类型转换:
- 若要过滤掉负值(保留ride_length非负的记录):
SELECT started_at - ended_at AS ride_length FROM [dbo] WHERE started_at >= ended_at;
- 若要筛选出负值的记录:
SELECT started_at - ended_at AS ride_length FROM [dbo] WHERE started_at < ended_at;
方案2:将Interval转换为数值类型比较
用EXTRACT(EPOCH FROM ...)把interval转换成以秒为单位的数值,即可和0直接比较:
- 过滤掉负值(保留非负记录):
SELECT started_at - ended_at AS ride_length FROM [dbo] WHERE EXTRACT(EPOCH FROM (started_at - ended_at)) >= 0;
- 筛选负值记录:
SELECT started_at - ended_at AS ride_length FROM [dbo] WHERE EXTRACT(EPOCH FROM (started_at - ended_at)) < 0;
内容的提问来源于stack exchange,提问作者dwoong
相关产品推荐
相关产品推荐

