PostgreSQL中current_setting为INTERVAL传参失效问题求助
解决PostgreSQL中使用会话变量作为INTERVAL参数的问题
问题根源
你代码里的问题在于直接用 interval current_setting(...) 的写法不符合PostgreSQL语法规则——INTERVAL 关键字后仅支持字符串字面量,会话变量需要显式转换为 interval 类型才能参与运算。另外第一个查询里的 myconstants.selfName 应为笔误,正确变量名是 myconstants.test。
正确写法示例
1. 拼接数值与单位后转换为interval
如果会话变量存储的是纯数值(比如test='10'),需先拼接单位字符串,再转换为interval类型:
set session myconstants.test = '10'; -- 方式1:用::语法转换 SELECT now()::time - concat(current_setting('myconstants.test')::varchar, ' min')::interval; -- 方式2:用cast函数转换 SELECT now()::time - cast(concat(current_setting('myconstants.test'), ' min') as interval);
2. 直接转换完整的interval字符串
如果会话变量存储的是带单位的完整表达式(比如testb='10 min'),直接转换即可:
set session myconstants.testb = '10 min'; -- 方式1:用::语法转换 SELECT now()::time - current_setting('myconstants.testb')::interval; -- 方式2:用cast函数转换 SELECT now()::time - cast(current_setting('myconstants.testb') as interval);
效果验证
上述写法和你原本的硬编码写法效果完全一致:
SELECT now()::time - INTERVAL '10 min';
内容的提问来源于stack exchange,提问作者王奕然
相关产品推荐
相关产品推荐

