将一年中的数字周转换为hiveql中的日期yyyy-mm-dd

问题描述

从hiveql中的日期中提取星期值很容易:

select date_format('2020-10-18','w');

是否具有逆转此过程的功能:提供年和周的数字时提取结束日期?

解决方法

要获取准确的日期,您还需要提供星期几以及一年中的年和周号。

select date_format('2020-10-18','w'),from_unixtime(unix_timestamp('2020,43,7','yyyy,w,u'),'yyyy-MM-dd');

返回:

43   2020-10-18

看起来一年中的星期几从星期日开始计数,一周中的天数从星期一开始计数,因为星期一是19日:

select date_format('2020-10-18','w u'),1','yyyy-MM-dd');

返回

43  2020-10-19

如果是这样,您可以通过从unix_timestamp中减去60*60*24来解决它:

select date_format('2020-10-18',u')-60*60*24,'yyyy-MM-dd');

返回:

43  2020-10-18

更新:令人惊讶的是,如果不提供一周中的某一天(仅提供年份和周数),则默认情况下它也可以将星期日计算为一周中的某天,但是对于其他日期而言,这是不正确的2020-01-20,它将返回同一天2020-01-18,请自己检查:

select date_format('2020-10-18',43',w'),'yyyy-MM-dd');

返回:

43  2020-10-18

因此,如果您一周中没有一天并且不需要绝对准确的日期,请使用

from_unixtime(unix_timestamp('2020,'yyyy-MM-dd');

或者这样(从表中选择年和周号):

  select from_unixtime(unix_timestamp(concat(col_year,',col_week),'yyyy-MM-dd') from your_table;