ОШИБКА: неверный синтаксис ввода для типа timestamp с часовым поясом - PullRequest
0 голосов
/ 20 июня 2019

У меня есть запрос PostgreSQL, как показано ниже, который работает нормально.Я вызываю его из сценария оболочки, как показано ниже:

Result=$(psql -U username -d database -t -c 
$'SELECT round(sum(i.total), 2) AS "ROUND(sum(i.total), 2)" 
  FROM invoice i 
  WHERE i.create_datetime = '2019-03-01 00:00:00-06' 
  AND i.is_review = '1' AND i.user_id != 60;')

Теперь я хочу, чтобы значение, которое я жестко закодировал как i.create_datetime = '2019-03-01 00:00:00-06', заменило его значением переменной даты.

У меня естьпробовал два способа

путь 1:

Result=$(psql -U username -d database -t -c 
$'WITH var(reviewMonth) as (values(\'$reviewMonth\')) 
SELECT round(sum(i.total),2) AS "ROUND(sum(i.total),2)" 
FROM var,invoice i 
WHERE i.create_datetime = var.reviewMonth::timestamp 
AND i.is_review = \'1\' AND i.user_id != 60;')

и

путь 2:

Result=$(psql -U username -d database -t -c 
$'SELECT round(sum(i.total),2) AS "ROUND(sum(i.total),2)" 
FROM invoice i 
WHERE i.create_datetime = \'$reviewMonth\' 
AND i.is_review = \'1\' AND i.user_id != 60;')

Но в обоих направлениях это выдает ошибку

ошибка 1-го пути выброса как:

ОШИБКА: оператор не существует: отметка времени с часовым поясом = текст

ошибка 2-го пути выброса как:

ОШИБКА: неверный синтаксис ввода для временной метки типа с часовым поясом: "$ reviewMonth"

Пожалуйста, предложите, какой должен быть мой подход.

1 Ответ

0 голосов
/ 20 июня 2019

Вы должны попробовать использовать переменные psql.Вот пример:

# Put the query in a file, with the variable TSTAMP:

> echo "SELECT :'TSTAMP'::timestamp with time zone;" > query.sql
> export TSTAMP='2019-03-01 00:00:00-06'
> RESULT=$(psql -U postgres -t --variable=TSTAMP="$TSTAMP" -f query.sql )
> echo $RESULT
2019-03-01 06:00:00+00

Обратите внимание, как мы форматируем строковый литерал в запросе:: 'TSTAMP'

Вы также можете выполнить подстановку самостоятельно.Вот пример использования heredoc:

> export TSTAMP='2019-03-01 00:00:01-06'
> RESULT=$(psql -U postgres -t << EOF
SELECT '$TSTAMP'::timestamp with time zone;
EOF
)
> echo $RESULT
2019-03-01 06:00:01+00

В этом случае мы не используем подстановку переменных psql, поэтому мы должны заключить переменную в кавычки, например, '$ TSTAMP'.Использование heredoc делает цитирование намного проще, чем использование -c, потому что вы не пытаетесь заключить в кавычки всю команду.

РЕДАКТИРОВАТЬ: больше примеров, потому что кажется, что этого недостаточно.TSTAMP не обязательно должен быть жестко запрограммирован, это просто переменная bash, которая может быть установлена, как любая другая переменная bash.

> TSTAMP=$(date -d 'now' +'%Y-%m-01 00:00:00')
> RESULT=$(psql -U postgres -t << EOF
SELECT '$TSTAMP'::timestamp with time zone;
EOF
)
> echo $RESULT
2019-06-01 00:00:00+00

Однако, если вы действительно ищете начало месяца, естьвообще не нужны переменные оболочки

> RESULT=$(psql -U postgres -t << EOF
SELECT date_trunc('month', now());
EOF
)
> echo $RESULT
2019-06-01 00:00:00+00
...