1. 程式人生 > >用hive寫一個獲取本日期的季度初的sql

用hive寫一個獲取本日期的季度初的sql

ble 等於 diff 需要 lock 2-0 lec select ediff

由於項目需要獲取(本季度的的發生額總和)/(本季度經歷的天數)的數據(還有月均,年均的數據)。

判斷季度的時候是一個難點,開始的時候寫了一堆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