1.删除分区:
(1)不带子分区的表:
alter table 表名 drop partition PART${v_month}
(2)带子分区的表:
注意数据源,SQL类型的选择
alter table DWA_V_D_CUS_AL_USER_INFO drop subpartition PART${v_last_month}_SUBPART_${v_last_day}
2.获取账期:
(1)获取当前账期:
select to_char(sysdate,'yyyyMMddHH24miss') v_date from dual; --精确到毫秒,例如:20181010230600
select to_char(sysdate , 'yyyymmdd') v_date, --获取当前账期
to_char(sysdate , 'yyyymm') v_month, --获取当前月
to_char(sysdate, 'dd') v_day, --获取当前日
to_char(sysdate , 'hh24') v_hour, --获取当前小时
to_char(sysdate,'mi') v_Minute, --获取时间的分
to_char(sysdate,'ss') v_Second, --获取时间的秒
to_char(sysdate,'hh24')-1 v_last_hour, --获取前一小时
to_char(sysdate-10/24,'yyyymm') v_last_month_10 , --获取前10小时对应的月
to_char(sysdate-10/24,'dd') v_last_day_10 , --获取前10小时对应的日
to_char(sysdate-10/24,'hh24') v_last_hour_10, --获取前10小时
to_char(sysdate,'hh24') v_hour_num,
from dual;
--注!!若想获取第几个小时作为判断条件,可设置v_hour_num的数据类型为:整数,注意与v_hour数据类型为:字符串的区别
(2)获取前N天账期
select to_char(sysdate-1 , 'yyyymmdd') v_date,
to_char(sysdate-1 , 'yyyymm') v_month,
to_char(sysdate-1, 'dd') v_day,
to_char(sysdate-2 , 'yyyymmdd') v_last_date
from dual;
select to_char(to_date('${v_month}${v_day}','yyyymmdd')-2,'yyyymm') v_last_month,
to_char(to_date('${v_month}${v_day}','yyyymmdd')-2,'dd') v_last_day
from dual;
月最后一天账期:
to_char(last_day(to_date('${v_month}', 'yyyyMM')), 'yyyymmdd') --月最后一天的数据
使用CASE WHEN 获取对应的账期:
acct_month =(case when '${v_day}'<17 then TO_CHAR(ADD_MONTHS(TO_DATE('${v_month}${v_day}','YYYYMMDD'),-2),'YYYYMM') else TO_CHAR(ADD_MONTHS(TO_DATE('${v_month}${v_day}','YYYYMMDD'),-1),'YYYYMM') end)
select to_char(sysdate,'d'), --每周第几天 ,
to_char(sysdate,'dd'), --每月第几天 ,
to_char(sysdate,'ddd'), --每年第几天 ,
to_char(sysdate,'ww'), --每年第几周 ,
to_char(sysdate,'mm'), --每年第几月 ,
to_char(sysdate,'q'), --每年第几季 ,
to_char(sysdate,'yyyy') --年
from dual;
转换格式:
select to_char(sysdate,'YYYY"年"mm"月"dd"日"') from dual; --结果:2018年10月12日
select to_char(sysdate,'YYYY/mm/dd hh24:mi:ss ssss') from dual; --结果:2018/10/12 10:31:06 0606
求某天是星期几
select to_char(to_date('2018-10-12','yyyy-mm-dd'),'day') from dual; --星期五
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; -- monday
设置日期语言 : ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
也可以这样: TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')
3.前置判断条件:
!!!需要根据所用日志表,procname,账期,数据条数的实际情况来改变对应的参数
SELECT sum(CNT) CNT40
FROM (select count(*) CNT
from dw_execute_log_bca
where procname in ('P_DWA_V_D_CUS_AL_NET_ADHERE')
and RESULT = 'SUCCESS'
and acct_month = '${v_month}${v_day}'
and row_num > 0
union all
select count(*) CNT
from dw_execute_log_bca
where procname = 'P_DM_D_L_MODEL_JW'
and acct_month = to_char(to_date('${v_month}${v_day}', 'yyyyMMdd') - 1,
'yyyyMMdd')
and row_num > 0
and result = 'SUCCESS');
4.采用循环调用流程来跑数:
(1)sql--if
获取账期节点(注意要输出v_month,v_day):
select to_char(to_date('${v_month}${v_day}' ,'yyyyMMdd')-1,'yyyyMM') v_month,
to_char(to_date('${v_month}${v_day}' ,'yyyyMMdd')-1,'dd') v_day
from dual;
判断条件是否满足节点:
Integer.parseInt(v_day)!=01 则继续循环
Integer.parseInt(v_day)==01则结束循环
(2)sql--sql--if
还有一种与此方法类似:
select to_char(to_date('${v_month}${v_day}' ,'yyyyMMdd')+1,'yyyyMM') v_month,
to_char(to_date('${v_month}${v_day}' ,'yyyyMMdd')+1,'dd') v_day
from dual;
select 20180729-'${v_month}${v_day}' CNT3 from dual;
CNT13>=0则继续循环
CNT13==0则结束循环