Oracle-Date-Case-1

Oracle 获取本周(本月)第一天等日期操作案例

获取日期时间信息参考

–本周(以下周显示为中国逻辑)

select trunc(sysdate-1, 'd') + 1 from dual;
select trunc(sysdate-1, 'd') + 7 from dual;

–本月

select trunc(sysdate, 'mm') from dual;
select last_day(trunc(sysdate)) from dual;

–本季

select trunc(sysdate, 'Q') from dual;
select add_months(trunc(sysdate, 'Q'), 3) - 1 from dual;

–本年

select trunc(sysdate, 'yyyy') from dual;
select add_months(trunc(sysdate, 'yyyy'), 12) - 1 from dual;

– 获取上月的开始时间和结束时间

select to_char(to_date(to_char(add_months(sysdate, -1), 'yyyy-mm'),'yyyy-mm'),'yyyy-mm-dd hh24:mi:ss')
from dual;

select to_char(to_date(to_char(sysdate, 'yyyy-mm'), 'yyyy-mm'),'yyyy-mm-dd hh24:mi:ss')
from dual;

– 获取前一天的开始时间和结束时间

select to_char(to_date(to_char(sysdate - 1, 'yyyy-mm-dd'), 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')
from dual;

select to_char(to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')
from dual;

– 获取上一个小时的开始时间和结束时间

select to_date(to_char(sysdate, 'yyyy-mm-dd') || (to_char(sysdate, 'hh24') - 1),'yyyy-mm-dd hh24')
from dual;

select to_date(to_char(sysdate, 'yyyy-mm-dd') || (to_char(sysdate, 'hh24')),'yyyy-mm-dd hh24')
from dual;

to_char()函数中的IW,WW 周别显示

1)ww的算法为每年1月1日为第一周开始,date+6为每一周结尾
  例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107
  公式 每周第一天 :date + 周 * 7 - 7
  每周最后一天:date + 周 * 7 - 1
2)iw的算法为星期一至星期日算一周,且每年的第一个星期一为第一周,
   例如20050101为星期六,所以用iw的算法是前年的53周,而20050103之后才是第一周的开始。
  公式 每周第一天 :next_day(date) + 周 * 7 - 7
  每周最后一天:next_day(date) + 周 * 7 - 1
3)其它:
  A、查今天是 "本月" 的第几周
  SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" from dual;
  或
  SELECT TO_CHAR(SYSDATE,'W') AS "weekOfMon" from dual;
  B、查今天是 "今年" 的第几周
  select to_char(sysdate,'ww') from dual;
  或
  select to_char(sysdate,'iw') from dual;

财务日期信息表结构

DA_CLNDR

字段名 类型 备注
CLNDR_DATE DATE 财务日期
FY NUMBER(5,0) 当前年份:2022
PERIOD NUMBER(5,0) 当前月份:1,2
WEEK NUMBER(5,0) 本年的第几周
FY_BEGIN DATE 本月开始日期
FY_END DATE 本月结束日期
PD_BEGIN DATE 本月生产开始日期
PD_END DATE 本月生产结束日期
WK_BEGIN DATE 本周第一天日期
WK_END DATE 本周最后一天日期

表结构 SQL

CREATE TABLE DA_CLNDR 
("CLNDR_DATE" DATE, 
"FY" NUMBER(5,0), 
"PERIOD" NUMBER(5,0), 
"WEEK" NUMBER(5,0), 
"FY_BEGIN" DATE, 
"FY_END" DATE, 
"PD_BEGIN" DATE, 
"PD_END" DATE, 
"WK_BEGIN" DATE, 
"WK_END" DATE, 
"CURRENT_VERSION" NUMBER(10,0) DEFAULT 0, 
"LAST_TX_DT" DATE, 
"SUB_WK" VARCHAR2(1 BYTE)
) ;

存储过程案例:自动生成财务日期信息( da_clndr )

CREATE OR REPLACE PROCEDURE AUTO_FIN_DATE
IS
    NEXT_DATE DATE;
BEGIN
    -- 自动生成当前月份,从当月的 1 号开始到月底 的财务日期数据
    NEXT_DATE := ADD_MONTHS(LAST_DAY(SYSDATE),-1) + 1;
    WHILE NEXT_DATE <= LAST_DAY(SYSDATE) LOOP
        MERGE INTO da_clndr USING (SELECT NEXT_DATE CC FROM dual) AA
        ON (TO_DATE(AA.CC) =  TO_DATE(da_clndr.CLNDR_DATE))
        WHEN NOT MATCHED THEN
        INSERT values 
        (NEXT_DATE, TO_NUMBER(TO_CHAR(NEXT_DATE,'YYYY')), TO_NUMBER(TO_CHAR(NEXT_DATE,'MM')), 
            TO_NUMBER(TO_CHAR(NEXT_DATE, 'iw')), ADD_MONTHS(LAST_DAY(NEXT_DATE),-1) + 1,LAST_DAY(NEXT_DATE),
            ADD_MONTHS(LAST_DAY(NEXT_DATE),-1) + 1, LAST_DAY(NEXT_DATE), 
            trunc((NEXT_DATE-1),'d') + 1,  trunc(NEXT_DATE-1, 'd') + 7,
            0,null,null);  		
        
        NEXT_DATE := NEXT_DATE + 1;
        
    END LOOP;
END;

测试案例

CALL AUTO_FIN_DATE();
select * from da_clndr WHERE FY=2022 AND PERIOD =2 ;
commit;
Contents
  1. 1. Oracle 获取本周(本月)第一天等日期操作案例
    1. 1.1. 获取日期时间信息参考
    2. 1.2. to_char()函数中的IW,WW 周别显示
    3. 1.3. 财务日期信息表结构
|