【问题标题】:convert numeric week of year to a date (yyyy-mm-dd) in hiveql将一年中的数字星期转换为 hiveql 中的日期 (yyyy-mm-dd)
【发布时间】:2020-10-21 22:09:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: date hive calendar hiveql simpledateformat


    【解决方案1】:

    要获得准确的日期,您还需要提供工作日以及一年中的年份和周数。

    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'), from_unixtime(unix_timestamp('2020, 43, 1', 'yyyy, w, u'), 'yyyy-MM-dd');
    

    返回

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

    返回:

    43  2020-10-18
    

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

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

    返回:

    43  2020-10-18
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多