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

convert numeric week of year to a date (yyyy-mm-dd) in hiveql

在 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');

Returns:

43   2020-10-18

好像一年中的周数是从星期日开始算起的,一周中的天数是从星期一开始算的,因为星期一是19号:

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

returns

43  2020-10-19

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

select date_format('2020-10-18','w'), from_unixtime(unix_timestamp('2020, 43, 1', 'yyyy, w, u')-60*60*24, 'yyyy-MM-dd');

Returns:

43  2020-10-18

更新: 令人惊讶的是,如果不提供一周中的某一天,仅提供年份和周数,它也可以默认将星期日计为工作日,但它是不正确的对于其他日期,例如 2020-01-20,它将 return 同一个星期日 2020-01-18,请自行检查:

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

returns:

43  2020-10-18

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

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

或者像这样(年份和周数从table中选择):

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