首页 > 解决方案 > 如果日期为 mmYYY 格式(mm-->Month,YYYY--->Year),如何获取月份部分?

问题描述

我需要从日期以 mmYYYY(032019) 格式存储的一列中获取“月份”。我需要获取月份列,如果月份值在 01,02,03(Jan,Feb,march) 中,那么我需要生成新列作为 2018-19。如果值为 072019,则需要生成新值作为 2019-20。我尝试下面的代码但没有得到想要的结果。有人可以指导我如何实现这一点。

    CASE WHEN month(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy'))) IN (01,02,03) THEN 
    CONCAT(CONCAT(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy'))))-1,'-'),
    substr(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy')))),3,4)) 
    ELSE CONCAT(CONCAT(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy')))),'-'),
    SUBSTR(year(to_date(from_unixtime(unix_timestamp(dt), 'dd-MM-yyyy'))))+1,3,4)) end

因为我的 dt 列不是 'dd-mm-yyyy' 格式,所以由于某些情况它没有给出正确的值,我不想使用直接子字符串函数从 dt 获取月份部分。我想使用月份函数或任何其他可以获取月份部分的函数来获取它,然后根据月份部分相应地生成输出列。

    Sample Data.
    dt=012019
    output : 2018-19

    dt=022019
    output : 2018-19

    dt=032019
    output : 2018-19

    dt=042019
    output : 2019-20

    dt=052019
    output : 2019-20

    dt=062019
    output : 2019-20

标签: hive

解决方案


下面的代码对我有用。

    CASE WHEN month(to_date(from_unixtime(unix_timestamp(dt,'MMyyyy')))) IN (01,02,03)   
    THEN concat(concat(year(to_date(substr(from_unixtime(unix_timestamp(dt, 'MMyyyy')),1,10)))-1,'-')
    ,substr(year(to_date(from_unixtime(unix_timestamp(dt, 'MMyyyy')))),3,4)) 
    ELSE concat(concat(year(to_date(from_unixtime(unix_timestamp(dt, 'MMyyyy')))),'-'),
    substr(year(to_date(substr(from_unixtime(unix_timestamp(dt, 'MMyyyy')),1,10)))+1,3,4)) END

推荐阅读