Как передать параметризованный ИНТЕРВАЛ в запросе slonik/postgres?

#postgresql #node-postgres #slonik

Вопрос:

Этот запрос кажется законным, когда я запускаю его в Datagrip со значением параметра '14 days'
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" ошибку, когда я пытаюсь его выполнить.

Я попробовал несколько вариантов, включая экранирование входных const interval="'14 days'" данных и добавление пар для ИНТЕРВАЛЬНОЙ функции (CURRENT_DATE - INTERVAL(${interval})) с теми же результатами ошибок.

Возможно ли таким образом параметризовать запрос slonik или я делаю что-то глупое?

Ответ №1:

Вы можете вычесть целое число, представляющее количество дней, из 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)
 

Комментарии:

1. Я уже знаю о большинстве этих альтернатив, что я действительно хочу сделать, так это параметризовать все выражение, как я, кажется, могу сделать, когда слоник не участвует. Это невозможно?