HIVE中实现本月某天对应上月同一天实现

  • 产品需求

        在一次计算一个城市日报指标的时候,产品提出了一个上月同期值的概念。然后给出的规则如下:

        在当月15号之前,对应上月的是从1号开始一次对应上月当天。即:2020-02-01 对应的上月同期是2020-01-01。

        在当月15号之后,对应上月的则需要从月底最后一天开始互相对应。即:2020-02-29对应的上月同期是2020-01-31。

  • HIVE中一些基础函数复习
1、DAYOFMONTH('yyyy-MM-dd'):返回传入日期距离当月1日的天数。
2、DATE_ADD('yyyy-MM-dd', int num):返回传入日期之后num天的日期。
3、DAY('yyyy-MM-dd'):返回传入日期之中的天。
4、ADD_MONTHS(yyyy-MM-dd,int num):返回num月前当天的日期,返回值格式:yyyy-MM-dd。
5、DATEDIFF('yyyy-MM-dd','yyyy-MM-dd'):返回两个日期之间差的天数。返回值格式:int。
6、LAST_DAY('yyyy-MM-dd'):返回传入日期当月的最后一天。返回值格式:yyyy-MM-dd。
7、DATE_SUB('yyyy-MM-dd',int num):返回传入日期之前num天的日期。
  • 实现DEMO
CASE 
  WHEN DAY(FROM_UNIXTIME(UNIX_TIMESTAMP('20200728','yyyyMMdd'),'yyyy-MM-dd')) <= 15 THEN
    REGEXP_REPLACE(ADD_MONTHS(FROM_UNIXTIME(UNIX_TIMESTAMP('20200728','yyyyMMdd'),'yyyy-MM-dd'), -1),'-','')
  ELSE 
    REGEXP_REPLACE(DATE_SUB(DATE_ADD(CONCAT('2020-07', '-01'), -1), DATEDIFF(LAST_DAY('2020-07-28'),'2020-07-28')),'-','')
END
或
IF(DAY(FROM_UNIXTIME(UNIX_TIMESTAMP('20200728','yyyyMMdd'),'yyyy-MM-dd')) <= 15, 
   REGEXP_REPLACE(ADD_MONTHS(FROM_UNIXTIME(UNIX_TIMESTAMP('20200728','yyyyMMdd'),'yyyy-MM-dd'), -1),'-',''),
  REGEXP_REPLACE(DATE_SUB(DATE_ADD(CONCAT('2020-07', '-01'), -1), DATEDIFF(LAST_DAY('2020-07-28'),'2020-07-28')),'-',''))

 

猜你喜欢

转载自blog.csdn.net/weixin_42742178/article/details/107665723