SQL开发实战技巧系列(十六):数据仓库中时间类型操作(初级)日月年时分秒之差及时间间隔计算

Posted 赵延东的一亩三分地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL开发实战技巧系列(十六):数据仓库中时间类型操作(初级)日月年时分秒之差及时间间隔计算相关的知识,希望对你有一定的参考价值。

系列文章目录

【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事
【SQL开发实战技巧】系列(二):简单单表查询
【SQL开发实战技巧】系列(三):SQL排序的那些事
【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串&UNION与OR的使用注意事项
【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论
【SQL开发实战技巧】系列(六):从执行计划看NOT IN、NOT EXISTS 和 LEFT JOIN效率,记住内外关联条件不要乱放
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
【SQL开发实战技巧】系列(八):聊聊如何插入数据时比约束更灵活的限制数据插入以及怎么一个insert语句同时插入多张表
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起
【SQL开发实战技巧】系列(十一):拿几个案例讲讲translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函数
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
【SQL开发实战技巧】系列(十四):计算消费后的余额&计算银行流水累计和&计算各部门工资排名前三位的员工
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算
【SQL开发实战技巧】系列(十七):数据仓库中时间类型操作(初级)确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算
【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据
【SQL开发实战技巧】系列(二十二):数仓报表场景☞ 从分析函数效率一定快吗聊一聊结果集分页和隔行抽样实现方式
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高


文章目录


前言

本篇文章讲解的主要内容是:日、月、年、时、分、秒之差及时间间隔计算
【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。


一、加减日、月、年

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

SQL> SELECT hiredate AS 聘用日期,
  2         hiredate - 5 AS5,
  3         hiredate + 5 AS5,
  4         add_months(hiredate, -5) AS5个月,
  5         add_months(hiredate, 5) AS5个月,
  6         add_months(hiredate, -5 * 12) AS5,
  7         add_months(hiredate, 5 * 12) AS58    FROM emp
  9   WHERE ROWNUM <= 1;

聘用日期    减5天       加5天       减5个月     加5个月     AS5AS5----------- ----------- ----------- ----------- ----------- ----------- -----------
1980-12-17  1980-12-12  1980-12-22  1980-7-17   1981-5-17   1975-12-17  1985-12-17

二、加减时、分、秒

SQL> SELECT hiredate AS 聘用日期,
  2         hiredate - 5 / 24 / 60 / 60 AS5,
  3         hiredate + 5 / 24 / 60 / 60 AS5,
  4         hiredate - 5 / 24 / 60 AS5分钟,
  5         hiredate + 5 / 24 / 60 AS5分钟,
  6         hiredate - 5 / 24 AS5小时,
  7         hiredate + 5 / 24 AS5小时
  8    FROM emp
  9   WHERE ROWNUM <= 1;

聘用日期    减5秒       加5秒       减5分钟     加5分钟     减5小时     加5小时
----------- ----------- ----------- ----------- ----------- ----------- -----------
1980-12-17  1980-12-16  1980-12-17  1980-12-16  1980-12-17  1980-12-16  1980-12-17

SQL> 

三、日期间隔之时、分、秒

两个date相减,得到的就是天数,乘以24就是小时,以此类推,可以计算出秒。

SQL> 
SQL> SELECT 间隔天数,
  2  间隔天数*24 AS 间隔小时,
  3  间隔天数*24*60 AS 间隔分,
  4  间隔天数*24*60*60 AS 间隔秒
  5  FROM( SELECT MAX(hiredate)-MIN(hiredate) AS 间隔天数
  6  FROM emp
  7  WHERE ename IN ('WARD','ALLEN'))X;

      间隔天数       间隔小时        间隔分        间隔秒
---------- ---------- ---------- ----------
         2         48       2880     172800

SQL> 

四、日期间隔之日、月、年

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

SQL> SELECT max_hd - min_hd 间隔天,
  2         months_between(max_hd, min_hd) 间隔月,
  3         months_between(max_hd, min_hd) / 12 间隔年
  4    FROM (SELECT min(hiredate) min_hd, MAX(hiredate) max_hd FROM emp) x;

       间隔天        间隔月        间隔年
---------- ---------- ----------
14906.6928 489.764283 40.8136903

总结

本章介绍的关于时间的计算比较简单,主要是为了后面时间计算文章做铺垫!

以上是关于SQL开发实战技巧系列(十六):数据仓库中时间类型操作(初级)日月年时分秒之差及时间间隔计算的主要内容,如果未能解决你的问题,请参考以下文章

SQL开发实战技巧系列(三十四):数仓报表场景☞如何对数据分级并行转为列

从一个SQL打印全年日历漫谈数据仓库中时间操作场景的重点写法

SQL开发实战技巧系列:SQL排序的那些事

SQL开发实战技巧系列:关于SQL不得不说的那些事

SQL开发实战技巧系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()fisrt_valuelast_valueratio_to_report

SQL开发实战技巧系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加