Как получить 20 дней до даты в одном формате: ГГГГММДД - PullRequest
2 голосов
/ 15 мая 2019

Как получить 20 дней до одного формата даты: YYYYMMDD?Функция date_sub(), кажется, не работает.

например, получить дату за 20 дней до '20180912' в Hive.

Я использую date_sub() при объединении двух таблиц по дате.

select a.*,b.*
from table1
left join
table2 
on
from_unixtime(unix_timestamp(date1,'yyyymmdd'))=date_sub(date2,20)

и ничего не вернуть.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Используемый вами формат неверен.Верхний / нижний регистр имеет большое значение .Правильный формат: 'yyyyMMdd'.

Date_sub для корректной работы требуется yyyy-MM-dd, при необходимости выполните преобразование.

select date_sub(from_unixtime(unix_timestamp('20180912','yyyyMMdd')),20) ;
OK
2018-08-23

Cast as timestamp дает неправильный результат (1970 год), возможно, это проблема в моей версии Hive (1.2.1) :

select cast(unix_timestamp('20180912','yyyyMMdd') as timestamp);
OK
1970-01-18 18:51:50.4

Использовать from_unixtime(unix_timestamp('20180912','yyyyMMdd')) для преобразования,работает нормально.

1 голос
/ 15 мая 2019

ОК, date_sub может выполнить ваше требование, как показано ниже:

select date_sub(CAST(unix_timestamp('20180912','yyyyMMdd') AS TIMESTAMP), 20) as date;
+-------------+--+
|    date     |
+-------------+--+
| 2018-08-23  |
+-------------+--+

И ваш SQL для объединения может написать так:

select
    a.*,
    b.*
from
    table1
left join
    table2 on date1 = regexp_replace(cast(to_date(date_sub(CAST(unix_timestamp(cast(date2 as string),'yyyyMMdd') AS TIMESTAMP), 20)) as string),'-','')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...