PostgreSQL中函数内日期减numeric报运算符不存在如何解决?
问题原因
PostgreSQL 的 date 类型仅支持与整数(int 类型)直接做减法,运算逻辑为减去指定天数。你直接执行 select 日期 - 1 时,字面量 1 会被默认识别为 int 类型,符合运算要求因此可以正常执行。
自定义函数中报错的核心原因是参数 p_number 的类型为 numeric(包括 decimal、float 等所有非整数的数值类型都归属于 numeric 大类),PostgreSQL 没有内置 date 和 numeric 类型的减法运算符,因此抛出了找不到对应运算符的错误。
解决方法
只需将 p_number 显式转换为 int 类型即可正常运算,常用有两种写法:
- PostgreSQL 专属简写语法
v_date date := p_date - p_number::int;
- 符合SQL标准的通用写法,跨数据库兼容性更好
v_date date := p_date - cast(p_number as int);
如果你的 p_number 存在小数位,转换为 int 时 PostgreSQL 会默认取整,你可以根据业务需求先调用 floor()(向下取整)、ceil()(向上取整)、round()(四舍五入)等函数处理后再做类型转换,示例如下:
-- 先向下取整再做日期减法 v_date date := p_date - floor(p_number)::int;
内容的提问来源于stack exchange,提问作者stacks
相关产品推荐
相关产品推荐

