Получить Импала эквивалент MONTHS_BETWEEN () в Снежинка - PullRequest
1 голос
/ 21 февраля 2020

У меня возникла проблема при переносе запросов из Impala в Snowflake:

Impala

SELECT period
    , now() as dt_today
    , MONTHS_BETWEEN(now(), period) as mb
FROM my_table

выход

period                  dt_today                        mb
--------------------------------------------------------------------------
2018-10-30T21:43:57Z    2020-02-21 10:21:12.827383000   15.709677419354838

Snowflake

SELECT period
    , CURRENT_TIMESTAMP() as dt_today
    , DATEDIFF('month', CURRENT_TIMESTAMP(), period) as mb
FROM my_table

урожайность

period                  dt_today                        mb
--------------------------------------------------------------------------
2018-10-30T21:43:57Z    2020-02-21 10:21:12.827383000   16

Теперь из Snowflake документация я понимаю, что при указании month в DATEDIFF Snowflake будет только «используйте месяц и год от даты» , что означает, что разница не такая точная, как у Impala. Я пытался внедрить прокси , например, взять разницу в месяце, а затем применить некоторые вычисления чтобы получить часть с плавающей запятой как таковую, но я все еще получаю неправильное число месяца:

DATEDIFF('month', period, CURRENT_TIMESTAMP()) + (GREATEST(DAY(period), DAY(CURRENT_TIMESTAMP())) -  LEAST(DAY(period), DAY(CURRENT_TIMESTAMP()))) / 31

, а также следующее, чтобы получить еще более точную, но это все еще не правильно:

DATEDIFF('day', period, CURRENT_TIMESTAMP())/31 + (GREATEST(DAY(period), DAY(CURRENT_TIMESTAMP())) -  LEAST(DAY(period), DAY(CURRENT_TIMESTAMP()))) / 31

Вопрос: как мне точно воспроизвести MONTHS_BETWEEN() Импалы в Снежинке?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

TL; DR

IFF(DAY(DATE1) >= DAY(DATE2), DATEDIFF('month', DATE2, DATE1), DATEDIFF('month', DATE2, DATE1) - 1)
+
IFF(DAY(DATE1) >= DAY(DATE2), (GREATEST(DAY(DATE1), DAY(DATE2)) - LEAST(DAY(DATE1), day(DATE2))) / 31, 1 - (GREATEST(DAY(DATE1), DAY(DATE2)) - LEAST(DAY(DATE1), DAY(DATE2))) / 31)

Импала MONTHS_BETWEEN(DATE1, DATE2) Функция работает следующим образом:

  • MONTHS_BETWEEN('2019-04-13', '2019-02-10') выход 2.0967 (2 полных месяцев + 3/31=0967)
  • MONTHS_BETWEEN('2019-04-13', '2019-02-03') урожайность 1.7741 (1 полных месяцев + 1-(7/31)=0967)

Теперь мы знаем, что Снежинка DATEDIFF(DATE1, DATE3) применяет простой месяц- месячная операция:

  • DATEDIFF('month', '2019-04-13', '2019-02-10') доходность 2 (04 - 02)
  • DATEDIFF('month', '2019-04-13', '2019-02-03') доходность 2 (04 - 02)

Чтобы получить целую часть Impala's MONTHS_BETWEEN с использованием функций Snowflake, мы применяем следующую логику c:

IFF(DAY(DATE1) >= DAY(DATE2), DATEDIFF('month', DATE2, DATE1), DATEDIFF('month', DATE2, DATE1) - 1)

Для того, чтобы получить дробную часть Impala's MONTHS_BETWEEN с использованием Snowflake к функциям мы применяем следующие логи c:

IFF(DAY(DATE1) >= DAY(DATE2), (GREATEST(DAY(DATE1), DAY(DATE2)) - LEAST(DAY(DATE1), day(DATE2))) / 31, 1 - (GREATEST(DAY(DATE1), DAY(DATE2)) - LEAST(DAY(DATE1), DAY(DATE2))) / 31)

Мы просто складываем их вместе, чтобы получить точное значение Импалы:

IFF(DAY(DATE1) >= DAY(DATE2), DATEDIFF('month', DATE2, DATE1), DATEDIFF('month', DATE2, DATE1) - 1)
+
IFF(DAY(DATE1) >= DAY(DATE2), (GREATEST(DAY(DATE1), DAY(DATE2)) - LEAST(DAY(DATE1), day(DATE2))) / 31, 1 - (GREATEST(DAY(DATE1), DAY(DATE2)) - LEAST(DAY(DATE1), DAY(DATE2))) / 31)
0 голосов
/ 21 февраля 2020

Насколько точной должна быть ваша разница?

Поскольку мой первый призыв - вычесть обе даты (получить разницу в днях) - или вы можете просто использовать datediff, просто извлекая день - и go оттуда (либо делением на 30/31, если приблизительное приближение, или с более сложным значением cal c, если мне нужно точное решение)

Ваше решение неверно, потому что месяцы в датированных числах будут отличаться на 1 даже в последующие дни, если взять, скажем, 31-е число c и 1-е января - те 2 дадут «1» в датированном виде как по году, месяцу и дню.

...