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;