如何在一种日期格式前获取20天:YYYYMMDD

时间:2019-05-15 06:54:41

标签: date hive hiveql

如何获取一种日期格式前的20天:YYYYMMDD?函数date_sub()似乎不起作用。

例如在Hive中获取日期'20180912'前20天。

我正在使用date_sub()按日期联接两个表。

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

,不返回任何内容。

2 个答案:

答案 0 :(得分:2)

您使用的格式是错误的一种。大写/小写matters a lot。正确的格式是'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 :(得分:1)

好的,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),'-','')