#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. Я уже знаю о большинстве этих альтернатив, что я действительно хочу сделать, так это параметризовать все выражение, как я, кажется, могу сделать, когда слоник не участвует. Это невозможно?