![075799031ee071da9e5e16d8852189f6.png](https://i-blog.csdnimg.cn/blog_migrate/09b043e218e84bcb9b8c40e8d258116f.jpeg)
需求1: 统计一年内所有是星期三的日期。思路: 枚举法,将整年所有日期都罗列出来,然后再用Where条件筛选。Step1: 求出当年的起初日期1/1和最后一天12/31(可省略)
SELECT
ADD_months(TRUNC(SYSDATE,'y'),12) -- 2021/1/1
FROM dual;
SELECT
TRUNC(SYSDATE,'y') -- 2020/1/1
FROM dual;
Step2: 将这两个日期相减,得出全年的天数365(或直接输入365也可以)Step3:用伪列Level从起始日期加一日,一共加到最后一日,或者直接输入365也可以。
SELECT TRUNC(SYSDATE, 'y') + (LEVEL - 1) 日期
FROM DUAL
CONNECT BY LEVEL <=
ADD_MONTHS(TRUNC(SYSDATE, 'y'), 12) - TRUNC(SYSDATE, 'y')
Step4:最后用where做条件筛选
![6eb03f8f203840d1f0ce56c3cea3440d.png](https://i-blog.csdnimg.cn/blog_migrate/8938f658385b19414fca832151643c2c.jpeg)
需求2: 确定当前月(某月)的第一个和最后一个星期的星期几 ,例如:星期三
Step1: 首先确定好本月的第一天,用Trunc函数截取当月首日。
Step2: 用Nextday函数对首日(第一周)
Step3: 用Lastday函数对当月最后一日(最后一周)
SELECT TRUNC(SYSDATE,'mm') AS 当月首日,
next_day(TRUNC(SYSDATE,'mm'),4) AS 当月第一周的周三,
next_day(Last_day(TRUNC(SYSDATE,'mm'))-7,4) 当月最后一周的周三,
Last_day(TRUNC(SYSDATE,'mm')) 当月最后一天
FROM dual;
![8065569ae4e92a56e32d25b96ddc713e.png](https://i-blog.csdnimg.cn/blog_migrate/efc48a363369d2628bccd6e4de19cdae.jpeg)
Next_Day基础用法:
SELECT NEXT_DAY(SYSDATE,1) AS 明天,
NEXT_DAY(SYSDATE,2) AS 后天 FROM DUAL; ---- 明天后天
SELECT NEXT_DAY(SYSDATE,-1) AS 明天,
NEXT_DAY(SYSDATE,-2) AS 后天 FROM DUAL; ---- 不能填写负数
![d0467a9ce7801b3ca7f190564b50022e.png](https://i-blog.csdnimg.cn/blog_migrate/d888d7e6368f4452c22529c8525f6ee4.png)
需求3:判断两个入职日期的工作日Step1: 找出入职日期最早,最晚日期
SELECT MAX(e.hiredate) AS Max_date,
MIN(e.hiredate) AS Min_date
FROM emp e;
![9b069c3c53a047dad0706e2894cc6dae.png](https://i-blog.csdnimg.cn/blog_migrate/2af0998f440c910cb5b4efc96835d163.png)
Step2: 用伪列将最早最晚日期中间所有的日期显示出现,两者相差的数值就是最大 - 最小。
SELECT T.min_date+(LEVEL -1) AS datestep
FROM (SELECT MAX(E.HIREDATE) AS MAX_DATE, MIN(E.HIREDATE) AS MIN_DATE
FROM EMP E) T
CONNECT BY LEVEL < = t.max_date - t.min_date
![d3dd7c6b1dfdc9b2ba2730d2eea3d989.png](https://i-blog.csdnimg.cn/blog_migrate/872c116fc954eb5ceb5e842effb2e89b.jpeg)
Step3: 判断所在的日期是否等于周六周日,Case When + To_char(xxx,'D')
SELECT SUM(CASE
WHEN TO_CHAR(T2.DATESTEP, 'd') NOT IN ('1', '7') THEN
1
ELSE
0
END) AS WORKDAYS
FROM (SELECT T.MIN_DATE + (LEVEL - 1) AS DATESTEP
FROM (SELECT MAX(E.HIREDATE) AS MAX_DATE,
MIN(E.HIREDATE) AS MIN_DATE
FROM EMP E) T
CONNECT BY LEVEL < = T.MAX_DATE - T.MIN_DATE) T2
![f6aaf21b719feeedf01f15b3155a7013.png](https://i-blog.csdnimg.cn/blog_migrate/6c6141571b03a96bd5c819a20b211eaa.jpeg)