trunc怎么进行日期相减_【PL/SQL】 关于日期操作的常见需求

075799031ee071da9e5e16d8852189f6.png

需求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

需求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


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

需求3:判断两个入职日期的工作日Step1: 找出入职日期最早,最晚日期

SELECT MAX(e.hiredate) AS Max_date,
       MIN(e.hiredate) AS Min_date 
	FROM emp e;

9b069c3c53a047dad0706e2894cc6dae.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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值