如何解决如何在 slonik/postgres 查询中传递参数化的 INTERVAL?
当我在参数值为 ->selectRaw('DISTINCT ON (hbg.group_id)
hbg.group_id,hbg.id AS id,hbg.group_name,hbg.group_description,hbg.group_type_id,hbgt.group_type_name,hbg.category_id,hbg.effective_start_datetime,hbg.created_by,hbg.created_datetime,hbg.archived_by,hbg.archived_datetime
')
的 Datagrip 中运行该查询时,它似乎是合法的
'14 days'
但是尝试在 slonik 中做类似的事情不会:
SELECT * FROM users WHERE users.updated_at < (CURRENT_DATE - INTERVAL $1)
似乎产生相同的查询:const interval='14 days'
// ...
const {rows} = await pool.query<any>(sql`
SELECT * FROM users WHERE users.updated_at < (CURRENT_DATE - INTERVAL ${interval}))
`)
但池的 "SELECT * FROM users WHERE updated_at < CURRENT_TIME - INTERVAL $1)"
方法在我尝试执行时抛出 query
错误。
我尝试了几种变体,包括转义输入 syntax error near "$1"
和为 INTERVAL 函数 const interval="'14 days'"
添加括号,但结果相同。
是否无法以这种方式参数化 slonik 查询,还是我在做一些愚蠢的事情?
解决方法
您可以从 CURRENT_DATE
中减去一个表示天数的整数,因为这是一个 date
值而不是一个 timestamp
SELECT * FROM users WHERE updated_at < CURRENT_DATE - $1
然后将 $1
作为整数传递
另一种选择是将特定长度的 interval
与参数相乘:
SELECT * FROM users WHERE updated_at < CURRENT_DATE - (interval '1 day' * $1)
或使用 make_interval()
函数:
SELECT * FROM users WHERE updated_at < CURRENT_DATE - make_interval(days => $1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。