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

相关文章
|
1月前
|
SQL Oracle 关系型数据库
Oracle查询优化-将字符和数字分离
【2月更文挑战第4天】【2月更文挑战第9篇】将字符和数字分离
40 2
|
1月前
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
200 1
|
1月前
|
SQL Oracle 关系型数据库
Oracle查询优化-计算字符在字符串中出现的次数
【2月更文挑战第3天】【2月更文挑战第7篇】只接上SQL
80 0
|
1月前
|
Oracle 关系型数据库 数据库
Oracle查询优化-阻止对某几列插入
【1月更文挑战第5天】【1月更文挑战第15篇】在Oracle数据库中,如果想要阻止对某些列的插入操作,有多种方法可以实现。
30 2
|
1月前
|
Oracle 关系型数据库 数据库
Oracle查询优化-复制表的定义及数据
【1月更文挑战第5天】【1月更文挑战第14篇】在Oracle数据库中,复制表定义和复制表数据是两个常见的操作。
68 1
|
1月前
|
Oracle 关系型数据库
Oracle查询优化-分解IP地址
【2月更文挑战第5天】【2月更文挑战第12篇】分解IP地址
36 8
|
1月前
|
存储 Oracle 关系型数据库
Oracle查询优化-提取姓名大写首字母缩写
【2月更文挑战第5天】【2月更文挑战第11篇】提取姓名大写首字母缩写
46 6
|
1月前
|
Oracle 关系型数据库
Oracle查询优化-行转列
【2月更文挑战第6天】【2月更文挑战第15篇】行转列
32 4
|
1月前
|
Oracle 关系型数据库
Oracle查询优化-列转行
【2月更文挑战第6天】【2月更文挑战第16篇】列转行
37 4
|
1月前
|
Oracle 关系型数据库
Oracle查询优化-累计求和
【2月更文挑战第6天】【2月更文挑战第14篇】累计求和
39 3

相关课程

更多

推荐镜像

更多