Oracle查询优化-07日期运算

7.1 加减日、月、年

在oracle中,date类型可以直接加减天数,而加减月份要用add_months函数.

select a.hiredate  雇用日期,
       a.hiredate + 5  加5天,
       a.hiredate - 5  减5天,
       add_months(hiredate, 5)  加5个月,
       add_months(hiredate, -5)  减5个月,
       add_months(hiredate, 5 * 12) 加5年,
       add_months(hiredate, -5 * 12)  减5年
  from emp a  where rownum <=1;


雇用日期 加5天  减5天  加5个月 减5个月 加5年  减5年
----------- ----------- ----------- ----------- ----------- ----------- -----------
1980-12-17 1980-12-22 1980-12-12 1981-05-17 1980-07-17 1985-12-17 1975-12-17

7.2 加减时、分、秒

上面讲过,date可以直接加减天数,那么1/24就是一小时,分钟与秒的加减类同。

select a.hiredate,
       a.hiredate - 5 / 24 / 60 / 605秒,
       a.hiredate + 5 / 24 / 60 / 605秒,
       a.hiredate - 5 / 24 / 605分钟,
       a.hiredate + 5 / 24 / 605分钟,
       a.hiredate - 5 / 245小时,
       a.hiredate + 5 / 245小时
  from emp a
 where rownum <= 1;

如果执行时,报错
这里写图片描述

数据库服务器端的编码和客户端字符集编码不一致。

我这边用的数据库西班牙语,不支持中文。


7.3 日期间隔之时、分、秒

SQL> select duration,
       duration * 24 间隔小时,
       duration * 24 * 60 间隔分钟,
       duration * 24 * 60 * 60 间隔秒
  from (select (max(a.hiredate) - min(a.hiredate)) as duration from emp a where
        a.ename in ('ALLEN', 'WARD')) x;


  DURATION       间隔小时       间隔分钟        间隔秒
---------- ---------- ---------- ----------
         2         48       2880     172800

7.4 日期间隔之日、月、年

加减月份用函数 add_months, 而计算月份间隔就要用函数months_between

select max_hd - min_hd  间隔天,
       months_between(max_hd, min_hd)  间隔月,
       months_between(max_hd, min_hd) /12 间隔年
  from (select min(hiredate) min_hd, max(hiredate) max_hd from emp)  x;


       间隔天        间隔月        间隔年
---------- ---------- ----------
      2348 77.1935483 6.43279569

7.5计算一年中周内各日期的次数

问题

计算一年中周内各日期(星期日、星期一 ……星期六)的次数。

解决方案

要计算一年中周内各日期分别有多少个,必须:

  1. 生成一年内的所有日期。

  2. 设置日期格式,得到每个日期对应为星期几。

  3. 计数周内各日期分别有多少个。

with x as
 (select level lvl
    from dual
  connect by level <=
             (add_months(trunc(sysdate, 'y'), 12) - trunc(sysdate, 'y')))
select to_char(trunc(sysdate, 'y') + lvl - 1, 'DAY'), count(*)
  from x
 group by to_char(trunc(sysdate, 'y') + lvl - 1, 'DAY');

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值