Oracle查询优化-07日期运算

举报
小工匠 发表于 2021/09/09 23:21:45 2021/09/09
【摘要】 7.1 加减日、月、年 在oracle中,date类型可以直接加减天数,而加减月份要用add_months函数. select a.hiredate 雇用日期, a.hiredate ...

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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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;
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

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


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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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');

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里写图片描述

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/68951535

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: [email protected]
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。