我想在Hive中找到以前的日期。
例如:
我的日期格式为20180821(yyyyMMdd
),我想在Hive中查找此日期的以前的日期。我尝试了date_sub()
函数,似乎它仅适用于yyyy-MM-dd
格式。
如何解决我的问题。请帮助
答案 0 :(得分:1)
在现有格式上使用yyyy-MM-dd
和from_unixtime
将格式转换为unix_timestamp
,然后使用date_sub
。
date_sub(from_unixtime(unix_timestamp('20180821','yyyyMMdd'),'yyyy-MM-dd'),1)
答案 1 :(得分:1)
可能重复:How to get previous day date in Hive
要回答您的问题,date_sub将获取前一天的记录。它仅适用于您的日期值,格式为:yyyy-MM-dd。
date_sub的语法为:
date_sub(String date, Int days)
因此,您需要首先将当前日期格式转换为yyyy-MM-dd
格式。为此,请使用以下查询:
SELECT from_unixtime(unix_timestamp('20180821','yyyyMMdd'),'yyyy-MM-dd' as converted_date_format;
接下来,您将date_sub应用于上面的结果集(具有1天的值)以获取上一条记录。
select date_sub(from_unixtime(unix_timestamp('20180821','yyyyMMdd'),'yyyy-MM-dd'),1) as previous_day;
话虽如此,如果您的要求是将日期格式保持为yyyyMMdd
,则可以应用regex_replace函数删除'-',如下所示:
select regexp_replace(date_sub(from_unixtime(unix_timestamp('20180821','yyyyMMdd'),'yyyy-MM-dd'),1),'-','') as previous_day_formatted_yyyymmdd;
希望这会有所帮助:)
答案 2 :(得分:1)
除了已经提供的unix_timestamp
转换解决方案之外,请考虑这一点。
使用substr()
进行的相同转换看起来要长一点,但是它可以与任何'19691231 19:00:00'
这样的日期/时间戳一起使用,而不会出现TZ问题,这也并不慢,因为不使用SimpleDateFormat / etc而不应用TZ
date_sub(concat_ws('-', substr('20180821',1,4), substr('20180821',5,2), substr('20180821',7,2)),1)