ETL相关语句

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');

猜你喜欢

转载自blog.csdn.net/LH0912666/article/details/82977460
ETL