Date_Add в Bigquery со строковым вводом: - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь использовать строковый ввод для сравнения диапазона дат с date_add, но он не работает.

  1. выберите CASE WHEN cast ('2020-01-10' в качестве даты )> CAST ('2010-01-09' КАК ДАТА) и приведение ('2020-01-10' как дата) <= DATE_ADD (CAST ('2010-01-09' КАК ДАТА), ИНТЕРВАЛ 7 ДНЯ) THEN 1 в противном случае 0 конечное значение </p>

  2. выберите СЛУЧАЙ КОГДА БЫЛО приведено («2020-01-10» в качестве даты)> CAST («2010-01-09» КАК ДАТА) и приведено («2020- 01-10 'как дата) <= cast (' 2020-01-16 'как дата) THEN 1 else 0 end val </p>

  3. выберите CASE WHEN cast (' 2020-01-10 'как дата) МЕЖДУ CAST (' 2010-01-09 'КАК ДАТА) и DATE_ADD (CAST (' 2010-01-09 'AS DATE), ИНТЕРВАЛ 7 ДНЯ) ТОГДА 1, иначе 0 конец val

В то время как запрос 1 возвращает истину, а два других возвращают ложь. Любое предложение, как это будет работать с date_add?

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Изучив ваш запрос, я понял, что ваша проблема связана с датами, указанными вами в СЛУЧАЕ, КОГДА .

Ранее я хотел бы указать, что если вам нужно поддержку, касающуюся метода DATE_ADD , вы можете прочитать подробнее здесь , а также другие полезные методы.

По поводу вашего первого запроса я разбил его на две части:

I)

SELECT
  CASE
    WHEN CAST('2020-01-10' AS date) > CAST('2010-01-09' AS DATE) then 'greater'
  ELSE
  'none of the options'
END
  val;

Выход для этого был "больше" , таким образом, условие было выполнено.

II)

SELECT
  CASE
     when CAST('2020-01-10' AS date)<= DATE_ADD(CAST('2010-01-09' AS DATE), INTERVAL 7 DAY ) THEN 'less or equal'
  ELSE
  'none of the options'
END
  val;

На выходе было "ни один из вариантов" потому что вы оцениваете, если '2020-01-10' меньше или равно '2010-01-09', что неверно.

Та же проблема возникла в вашем третьем запросе, где вы используете МЕЖДУ метод. В своем утверждении CASE WHEN вы оцениваете, находится ли «2020-01-10» между «2010-01-09» и «2010-01-09», а это не так. Поэтому имеет смысл не возвращать истину.

Об использовании вами методов, вы использовали их правильно, ваша проблема была только в этой незначительной ошибке, которую я объяснил выше.

В качестве дополнительной информации: вы не делаете Вам нужно использовать функцию CAST () внутри вас DATE_ADD () , потому что BigQuery поддерживает принудительное приведение литералов от STRING до ДАТА или TIMESTAMP утверждает, что:

Приведение букв необходимо, когда фактический тип литерала отличается от тип, ожидаемый рассматриваемой функцией. Например, если функция fun c () принимает аргумент DATE, то выражение fun c ("2014-09-27") является допустимым, поскольку литерал STRING "2014-09-27" приводится к DATE.

Подробнее об этом можно прочитать здесь .

Надеюсь, это поможет.

0 голосов
/ 28 января 2020

Как сказано в комментариях, четко определите даты, которые вы используете.

Чтобы облегчить путаницу (и отразить, как вы можете использовать свои высказывания в реальной жизни), подумайте о «параметризации» вашего даты в CTE / таблице. Это облегчит чтение ваших оценочных утверждений, и вам придется определять даты только один раз.

with data as (
  select cast('2020-01-10' as date) as test_date,cast('2010-01-09' as date) as begin_date
)
select test_date between begin_date and date_add(test_date, interval 7 day) as is_in_inverval
from data

Это также может быть избыточно, поскольку test_date всегда будет меньше результата date_add(), если интервал положительный.

...