Как передать переменные как выражения в Bigquery timestamp_diff - PullRequest
0 голосов
/ 05 апреля 2020

В настоящее время я пытаюсь проверить разницу в метках времени в часах с помощью выражений, передаваемых в виде переменных через командную строку. Но я не могу получить желаемый результат при прохождении через переменные.

a=2019-11-1812:49:43
b=2020-04-04 20:32:33

timediff=$(bq query --nouse_legacy_sql \ 'SELECT TIMESTAMP_DIFF(TIMESTAMP "'$a'", TIMESTAMP "$b", HOUR);')

Похоже, переменные, которые я передаю, не распознаются. Может кто-нибудь помочь мне понять правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

В дополнение к ответу Хеманта для дальнейшего вклада в сообщество я предоставлю альтернативный метод.

Как указано в документации , в BigQuery можно использовать параметризованные запросы с использованием интерфейса командной строки (CLI). Вам необходимо использовать флаг --parameter в вашей команде bq query , чтобы указать переменные / параметры, которые вы будете использовать.

Этот флаг должен быть в формате name:type:value. Хотя, если тип опущен, он будет использоваться как STRING . Как пример:

timediff= $(bq query --use_legacy_sql=false 
--parameter='ts_value:TIMESTAMP:2016-12-07 08:00:00' 
--parameter='ts_value1:TIMESTAMP:2016-12-07 09:00:00' 
'SELECT
  TIMESTAMP_DIFF(@ts_value,@ts_value1, HOUR)')

echo $timediff

И вывод:

+-----+
| f0_ |
+-----+
|  -1 |
+-----+

Вы можете использовать --format=csv для форматирования вывода в виде строки:

f0_ -1

Кроме того, я хотел бы добавить, что вы можете использовать псевдонимы для упрощения вашего запроса. Например:

alias bq_set="bq query --use_legacy_sql=false --format=pretty"

timediff=$(bq_set 
--parameter='ts_value:TIMESTAMP:2016-12-07 08:00:00' 
--parameter='ts_value1:TIMESTAMP:2016-12-07 09:00:00' 
'SELECT
   TIMESTAMP_DIFF(@ts_value,@ts_value1, HOUR)')

echo $timediff

Вывод:

+-----+
| f0_ |
+-----+
|  -1 |
+-----+

Как видите, это была просто альтернатива простому вашему запросу.

0 голосов
/ 05 апреля 2020

Попробуйте использовать одинарные кавычки вокруг переменных, но двойные кавычки вокруг всего запроса. Например:

a='2019-11-18 12:49:43'
b='2020-04-04 20:32:33'

timediff=$(bq query --format=csv --nouse_legacy_sql "SELECT TIMESTAMP_DIFF(TIMESTAMP '$a', TIMESTAMP '$b', HOUR);" | awk 
'NR>1')

echo $timediff
-3319

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...