内容参考来源 :
https://blog.csdn.net/winne_shen/article/details/79668164
https://blog.csdn.net/ztg2006/article/details/5287035
https://blog.csdn.net/weixin_34757654/article/details/116418213
一、oracle获取连续日期 分钟,小时等,以下内容,更多是提供一种思路:
-- 获取每一天的分钟数
SELECT TO_DATE('2018-03-23', 'YYYY-MM-DD') + (ROWNUM - 1) / (24 * 60) tm
FROM DUAL CONNECT BY ROWNUM <= 24*60;
-- 获取某天的每10分钟时间
SELECT TO_DATE('2018-03-23', 'YYYY-MM-DD') + (ROWNUM - 1) / (24 * 6) tm
FROM DUAL CONNECT BY ROWNUM <= 24*6;
-- 获取某天每小时的时间
SELECT TO_DATE('2018-03-23', 'YYYY-MM-DD') + (ROWNUM - 1) / 24
FROM DUAL CONNECT BY ROWNUM <= 24;
-- 获取某段时间的小时列表
SELECT to_date('2013-07-01 12', 'yyyy-mm-dd hh24') + (ROWNUM - 1) / 24 sdate FROM dual
CONNECT BY ROWNUM <= (to_date('2013-07-02 22', 'yyyy-mm-dd hh24') - to_date('2013-07-01 12', 'yyyy-mm-dd hh24')) * 24 + 1;
-- 获取某时间段内每天的日期
SELECT TO_DATE('2018-03-23', 'YYYY-MM-DD') + (ROWNUM - 1)
FROM DUAL CONNECT BY ROWNUM <=
TRUNC(TO_DATE('2020-03-23', 'YYYY-MM-DD')) - TRUNC(TO_DATE('2018-03-23', 'YYYY-MM-DD'));
-- 获取某时间段内的每月
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2018-03-02', 'YYYY-MM-DD'), ROWNUM - 1), 'YYYY-MM')
FROM DUAL CONNECT BY ROWNUM <=
CEIL(MONTHS_BETWEEN(TO_DATE('2020-03-03', 'YYYY-MM-DD'), TO_DATE('2018-03-02','YYYY-MM-DD')));
-- 获取某时间段内每年的年份
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2018-03-02', 'YYYY-MM-DD'), (ROWNUM - 1) * 12), 'YYYY')
FROM DUAL CONNECT BY ROWNUM <=
CEIL(MONTHS_BETWEEN(TO_DATE('2020-03-03', 'YYYY-MM-DD'), TO_DATE('2018-03-02','YYYY-MM-DD')) / 12);
-- 获取某时间段内每周的起始日期(周一)和其周数
SELECT TRUNC(TO_DATE('2018-03-02', 'YYYY-MM-DD') + (ROWNUM - 1) * 7, 'D') + 1 AS STARTTIME,
TO_CHAR( TO_DATE('2018-03-02', 'YYYY-MM-DD') + (ROWNUM - 1) * 7, 'IW') AS WEEK
FROM DUAL CONNECT BY ROWNUM <=
TRUNC(TO_DATE('2019-03-02', 'YYYY-MM-DD') - TO_DATE('2018-03-02', 'YYYY-MM-DD')) / 7 + 1;
二、Oracle trunc()函数的总结
截取日期
select trunc(sysdate) from dual; --截取到天 2021-05-28 00:00:00
select trunc(sysdate, 'hh24') from dual;--截取到小时 2021-05-28 17:00:00
select trunc(sysdate, 'mi') from dual; --截取到分钟 2021-05-28 17:39:00
select trunc(sysdate,'yy') from dual; --返回当年第一天 2021-01-01 00:00:00
select trunc(sysdate,'yyyy') from dual; --返回当年第一天 2021-01-01 00:00:00
select trunc(sysdate, 'mm') from dual; --返回当月第一天 2021-05-01 00:00:00
select trunc(sysdate,'dd') from dual; --返回当前年月日 2021-05-28 00:00:00
select trunc(sysdate,'q') from dual; --返回当季的第一天 2021-04-01 00:00:00
select trunc(sysdate,'d') from dual; --(星期日)返回本周(周日开始->周六)的第一天 2021-05-23 00:00:00
select trunc(sysdate,'iw') from dual; -- 返回本周(iw算法:周一到周日)的第一天,周一, 2021-05-24 00:00:00
select trunc(sysdate, 'ww') from dual; -- 返回本周的第一天,20210101是周五,所以这里返回 2021-05-28 00:00:00(周五)
select trunc(sysdate, 'w') from dual; -- 当月本周的第一天(从本月1号算本周的第一天,8号算第二周的第一天),2021-05-22 00:00:00
截取数字:精度舍去,如果小数位数不够,不会补0;
select trunc(123.458) from dual; --123
select trunc(123.458, 0) from dual; --123
select trunc(123.458, 1) from dual; --123.4
select trunc(123.458, -1) from dual; --120
select trunc(123.458, -4) from dual; --0
select trunc(123.458, 4) from dual; --123.458
select trunc(123) from dual; --123
select trunc(123, 1) from dual; --123
select trunc(123, -1) from dual; --120
三、Oracle to_char()函数中的IW,WW 周别显示
ww的算法为每年1月1日为第一周开始,date+6为每一周结尾
例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107
公式 每周第一天 :date + 周 * 7 - 7
每周最后一天:date + 周 * 7 - 1
iw的算法为星期一至星期日算一周,且每年的第一个星期一为第一周
例如20050101为星期六,所以用iw的算法是前年的53周,而20050103之后才是第一周的开始。
公式 每周第一天 :next_day(date) + 周 * 7 - 7
每周最后一天:next_day(date) + 周 * 7 - 1
其它:
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;