PostgreSQL计算周结束日期报错:timestamp无+double precision运算符
报错原因
ERROR: operator does not exist: timestamp without time zone + double precision
该报错的核心是extract(isodow from loads.ship_date)返回值为*双精度浮点数(double precision)*类型,PostgreSQL未内置timestamp类型与浮点数直接相加的运算规则,你需要将计算得到的天数差值转换为合法的运算类型再执行计算。
可用解决方案
- 方案1:将天数差值转换为时间间隔类型运算,保留
ship_date的时分秒信息:
loads.ship_date + ((6 - extract(isodow from loads.ship_date))::int || ' day')::interval
更规范的函数写法:
loads.ship_date + make_interval(days => (6 - extract(isodow from loads.ship_date))::int)
- 方案2:先将
timestamp转为date类型计算(自动舍弃时分秒),再转回timestamp,写法更简洁:
(loads.ship_date::date + (6 - extract(isodow from loads.ship_date))::int)::timestamp
效果验证
以你给出的2021年6月30日(周三,isodow返回值为3)为例:
计算逻辑:6 - 3 = 3,对应加3天,最终得到结果为2021-07-03,符合你预期的周六为周结束日期的规则。
内容的提问来源于stack exchange,提问作者Paul Parks
相关产品推荐
相关产品推荐

