Как получить DATE_DIFF в десятичном формате - PullRequest
0 голосов
/ 21 ноября 2018

Мои друзья мигрируют из Netezza в BigQuery.В Netezza функция month_between возвращает им десятичный результат.Между тем в BQ date_diff всегда является целым числом.Есть ли способ получить дробный вывод в BQ?

( их логика )

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете написать UDF:

CREATE TEMP FUNCTION months_between_impl(date_1 DATE, date_2 DATE) AS (
    CASE
      WHEN date_1 = date_2 
        THEN 0
      WHEN EXTRACT(DAY FROM DATE_ADD(date_1, INTERVAL 1 DAY)) = 1
        AND EXTRACT(DAY FROM DATE_ADD(date_2, INTERVAL 1 DAY)) = 1 
        THEN DATE_DIFF(date_1,date_2, MONTH)
      WHEN EXTRACT(DAY FROM date_1) = 1 
        AND EXTRACT(DAY FROM DATE_ADD(date_2, INTERVAL 1 DAY)) = 1 
        THEN DATE_DIFF(DATE_ADD(date_1, INTERVAL -1 DAY), date_2, MONTH) + 1/31
      ELSE DATE_DIFF(DATE_ADD(date_1, INTERVAL -1 DAY), date_2, MONTH) - 1 + EXTRACT(DAY FROM DATE_ADD(date_1, INTERVAL -1 DAY)) / 31 + (31 - EXTRACT(DAY FROM date_2) + 1) / 31
    END
  );

CREATE TEMP FUNCTION months_between(date_1 DATE, date_2 DATE) AS (
  TRUNC(months_between_impl(date_1, date_2),9)
);




WITH
  t AS (
  SELECT DATE("2005-02-02") AS from_date, DATE("2005-01-01") AS to_date, "1.032258064516129" AS Expected
  UNION ALL
  SELECT DATE("2007-03-15"), DATE("2007-02-20"), "0.838709677419354"
  UNION ALL
  SELECT DATE("2008-03-29"), DATE("2008-02-29"),  "1.0" 
  UNION ALL
  SELECT DATE("2008-03-31"), DATE("2008-02-29"),  "1.0" 
  UNION ALL
  SELECT DATE("2005-11-29"), DATE("2006-03-01"),  "-3.096774194" 
  UNION ALL
  SELECT DATE("1993-07-01"), DATE("1993-03-31"),  "3.03225806" 
  UNION ALL
  SELECT DATE("2005-03-31"), DATE("2005-01-01"),  "2.967741935" 
  UNION ALL
  SELECT DATE("2008-03-30"), DATE("2008-02-29"),  "1.032258064516129" 
)

SELECT
  from_date, to_date, expected, months_between(from_date, to_date) months_Between
FROM t;

enter image description here

добавлено Михаилом

Нижереальный прогон на Netezza, показывающий, что вышеуказанный UDF на самом деле возвращает абсолютно правильный результат (поскольку по какой-то причине числа в столбце expected - это не то, что на самом деле возвращает Netezza - скорее правильные числа находятся в столбце result - что, как я уже упоминал, точно, что UDF Фелипепроизводит)

enter image description here

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