前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle查询优化-07日期运算

Oracle查询优化-07日期运算

作者头像
小小工匠
发布2021-08-16 16:00:11
6620
发布2021-08-16 16:00:11
举报
文章被收录于专栏:小工匠聊架构

7.1 加减日、月、年

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

代码语言:javascript
复制
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就是一小时,分钟与秒的加减类同。

代码语言:javascript
复制
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;

如果执行时,报错

这里写图片描述
这里写图片描述

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

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


7.3 日期间隔之时、分、秒

代码语言:javascript
复制
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

代码语言:javascript
复制
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. 计数周内各日期分别有多少个。
代码语言:javascript
复制
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');
这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/04/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7.1 加减日、月、年
  • 7.2 加减时、分、秒
  • 7.3 日期间隔之时、分、秒
  • 7.4 日期间隔之日、月、年
  • 7.5计算一年中周内各日期的次数
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档