Как узнать количество лет между двумя датами времени в Hive? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь найти количество лет между двумя датами отметки времени в Hive.

Это я пробовал в SQL.

В SQL:

Datediff (год, date1, date2)

Но в Hive я попытался:

Datediff(year(date1), year(date2))

Но это выдает ошибку, утверждающую, что

"не может распознать ввод около 'datediff''(' 'year' в спецификации выражения "

Может кто-нибудь помочь мне в изучении этой новой вещи.

Ответы [ 4 ]

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

Существует несколько способов достижения таких результатов:

1) Извлечение и вычитание

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

select abs(extract(year from "2019-01-29") - extract(year from "2020-01-20"));

Проблема этого подхода в том, что он вернет вам 0, даже если вы вычитаете первый и последний день того же года, и вернет 1, если ваши две даты - 31 декабря и 1 января, ноесли это не вредно для варианта использования, и нам просто нужно посмотреть, изменился ли год между двумя датами, тогда этот подход может быть полезен.

2) функция datediff

Функция будетвернуть количество дней между начальной и конечной датой.Когда вы разделите это на 365,25, он вернет количество лет в десятичных разрядах.

select datediff('2019-02-01', '2019-01-27')/365.25;

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

select cast(datediff('2019-02-01', '2019-01-27')/365.25 as int);

3) months_between function

Эта функция вернет разницу в количестве месяцев междудве даты.

select abs(cast(months_between('2019-01-10', '2020-01-10')as int));

Приведенный выше запрос вернет 12 в результате.Если вы хотите получить результат в количестве лет, то вы можете разделить результат вышеупомянутого запроса на 12.

4) Пользовательский UDF

Этот подход сложен, тогда всевыше, поскольку вам нужно написать свою пользовательскую функцию UDF, а затем выполнить проверку по всем сценариям.

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

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

Вот ссылка для справки: Руководство по языку Hive

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

Если вводится строка и отметка времени, вы можете попробовать ниже

hive> select current_timestamp();
OK
2019-01-29 04:57:04.128
hive> select year(from_unixtime(unix_timestamp('2019-01-29 04:57:04.128', 'yyyy-MM-dd HH:mm:ss.SSS'), 'yyyy-MM-dd'));
OK
2019

hive> select year(from_unixtime(unix_timestamp('2021-01-29 04:57:04.128', 'yyyy-MM-dd HH:mm:ss.SSS'), 'yyyy-MM-dd')) - year(from_unixtime(unix_timestamp('2019-01-29 04:57:04.128', 'yyyy-MM-dd HH:mm:ss.SSS'), 'yyyy-MM-dd'));
OK
2
Time taken: 0.054 seconds, Fetched: 1 row(s)
0 голосов
/ 29 января 2019

Предполагая, что вам нужно целое число, вы можете выполнить вычисление напрямую:

select (case when date_format(date1, 'MMDD') < date_format(date2, 'MMDD')
             then year(date1) - year(date2) - 1
             else year(date1) - year(date2)
        end)

Или вы можете использовать приближение:

select datediff(date1, date2) / 365.25
0 голосов
/ 29 января 2019

Вы можете попробовать следующее:

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