Oracle查询优化-07日期运算

简介: 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 / 60 减5秒,
       a.hiredate + 5 / 24 / 60 / 60 加5秒,
       a.hiredate - 5 / 24 / 60 减5分钟,
       a.hiredate + 5 / 24 / 60 加5分钟,
       a.hiredate - 5 / 24 减5小时,
       a.hiredate + 5 / 24 加5小时
  from emp a
 where rownum <= 1;

如果执行时,报错


20170403032929934.png


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

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


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

image.png

相关文章
|
7月前
|
Oracle 关系型数据库 数据库
oracle日期加减的三种方式
【8月更文挑战第15天】在Oracle数据库中,可通过三种方式对日期进行加减操作:一是利用`ADD_MONTHS`函数增减月份,如`ADD_MONTHS(SYSDATE, 2)`表示两个月后;二是运用算术运算符直接加减天数,如`SYSDATE + 7`表示七天后;三是采用`INTERVAL`表达式增加或减少特定时间间隔,如`SYSDATE + INTERVAL &#39;2&#39; YEAR`表示两年后。这些方法可根据实际需求灵活选用。
3187 5
|
8月前
|
SQL Oracle 算法
|
10月前
|
Oracle 关系型数据库 数据管理
Oracle常用系统函数之日期和时间类函数:时空穿梭者的魔法棒
【4月更文挑战第19天】Oracle数据库中的日期和时间函数是强大的工具,如同时空穿梭者的魔法棒。`SYSDATE`和`CURRENT_TIMESTAMP`能显示当前时间,助你在数据中记录关键时刻;`ADD_MONTHS`函数让你轻易跃过月份,实现时间穿越;而`TO_DATE`和`TO_CHAR`则负责日期和时间的格式转换,如同时间的化妆师。除此之外,还有`EXTRACT`、`LAST_DAY`等更多魔法道具,帮助数据管理专家们自如操控时间,解决各种挑战。掌握这些函数,你也能在数据世界中自由穿梭!
|
10月前
|
Oracle 关系型数据库
Oracle查询优化-列转行
【2月更文挑战第6天】【2月更文挑战第16篇】列转行
76 4
|
10月前
|
Oracle 关系型数据库
Oracle查询优化-行转列
【2月更文挑战第6天】【2月更文挑战第15篇】行转列
71 4
|
10月前
|
Oracle 关系型数据库
Oracle查询优化-累计求和
【2月更文挑战第6天】【2月更文挑战第14篇】累计求和
82 3
|
10月前
|
SQL Oracle 关系型数据库
Oracle查询优化-聚集函数
【2月更文挑战第5天】【2月更文挑战第13篇】聚集函数
56 4
|
10月前
|
Oracle 关系型数据库
Oracle查询优化-分解IP地址
【2月更文挑战第5天】【2月更文挑战第12篇】分解IP地址
83 8
|
10月前
|
存储 Oracle 关系型数据库
Oracle查询优化-提取姓名大写首字母缩写
【2月更文挑战第5天】【2月更文挑战第11篇】提取姓名大写首字母缩写
186 6
|
10月前
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
1016 1

推荐镜像

更多