用hive写一个获取本日期的季度初的sql

Posted Yuppy在学习的路上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用hive写一个获取本日期的季度初的sql相关的知识,希望对你有一定的参考价值。

由于项目需要获取(本季度的的发生额总和)/(本季度经历的天数)的数据(还有月均,年均的数据)。

判断季度的时候是一个难点,开始的时候写了一堆case when 来判断月份,后来写着写着发现,这样也太笨了。于是就开始想办法。

突然灵机一动,一个季度都是以3个月份为一个体的。何不先算出本日是第几季度,然后再乘以3就是季度初啊。

因为3月份除以3就等于1了.必须除一个比3大的数,而且月份的数字只会到12.不用担心除以3.1会出什么乱子。

下面是计算第几季度的sql

select floor(substr(‘2017-02-04‘,6,2)/3.1)+1

出来了第几季度之后就简单了。直接*3呗  就是季度的初始日期了。

select (floor(substr(‘2017-02-04‘,6,2)/3.1)*3)+1

 

具体源代码:

select bill_no,

sum(case when part_dt >= concat(substr(‘${START_DATE}‘,1,7),‘-01‘) and part_dt<=‘${START_DATE}‘ then nvl(amt,0) else 0 end)/((DATEDIFF(‘${START_DATE}‘,CONCAT(SUBSTR(‘${START_DATE}‘,1,7),‘-01‘))+1)) month_da,

sum(case when part_dt >= concat(substr(‘${START_DATE}‘,1,4),‘-‘,substr(concat(‘00‘,floor(substr(‘${START_DATE}‘,6,2)/3.1)*3+1),-2),‘-01‘) and part_dt<=‘${START_DATE}‘ then nvl(amt,0) else 0 end)/((DATEDIFF(‘${START_DATE}‘,CONCAT(SUBSTR(‘${START_DATE}‘,1,4),‘-‘,SUBSTR(CONCAT(‘00‘,FLOOR(SUBSTR(‘${START_DATE}‘,6,2)/3.1)*3+1),-2),‘-01‘))+1)) quarter_da,

sum(case when part_dt >= concat(substr(‘${START_DATE}‘,1,4),‘-01-01‘) and part_dt<=‘${START_DATE}‘ then nvl(amt,0) else 0 end)/((DATEDIFF(‘${START_DATE}‘,CONCAT(SUBSTR(‘${START_DATE}‘,1,4),‘-01-01‘))+1)) year_da

from xxxx_table_xxxx dlt

group by bill_no

 

以上是关于用hive写一个获取本日期的季度初的sql的主要内容,如果未能解决你的问题,请参考以下文章

SQL数据库代码如何根据日期获取属于哪个季度

如何在 Hive SQL 中获取季度至今?

用php获取本周,上周,本月,上月,本季度日期的代码

获取一个季度的第一天和最后一天以及 2 个季度的日期

如何 用mysql语句获取本季度的第一天 本月

用php获取本周,上周,本月,上月,本季度日期的代码