当前位置: 首页 > news >正文

【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开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。


一、确定两个日期之间的工作天数

现在有个需求:返回员工BLAKE与JONES聘用日期之间的工作天数。
先看一下初始数据:

SQL> select ename,hiredate from emp where ename in ('BLAKE','JONES');ENAME      HIREDATE
---------- -----------
BLAKE      1981-5-1
JONES      1981-4-2

接下来一步步分析这个需求怎么做!
第一步,先初始化个600条数据的临时表T,具体啥用待会给大家说

with t as (
select level as id from dual connect by level<=600
)

第二步,通过max,mingroup by将上面初始数据转为一行,这个结果做第二个临时表T1:

SQL> with t as2   (select level as id from dual connect by level <= 600),3  t1 as4   (select min(hiredate) as min_hd, max(hiredate) as max_hd5      from emp6     where ename in ('BLAKE', 'JONES'))7  select * from t1;MIN_HD      MAX_HD
----------- -----------
1981-4-2    1981-5-1

第三步,枚举出来两个日期之间的间隔天数,不过日期相减需要+1,比如1~2天是2天,所以计算公式应该是(2-1)+1

SQL> with t as2   (select level as id from dual connect by level <= 600),3  t1 as4   (select min(hiredate) as min_hd, max(hiredate) as max_hd5      from emp6     where ename in ('BLAKE', 'JONES'))7  select (max_hd-min_hd)+1 as 天数 from t1;天数
----------30

第四步,将T表与T1表做个笛卡尔积,枚举出来这30天的所有日期。

SQL> set pagesize 200;
SQL> 
SQL> with t as2   (select level as id from dual connect by level <= 600),3  t1 as4   (select min(hiredate) as min_hd, max(hiredate) as max_hd5      from emp6     where ename in ('BLAKE', 'JONES'))7  select min_hd + (t.id - 1) as 日期8    from t, t19   where t.id <= ((max_hd - min_hd) + 1);日期
-----------
1981-4-2
1981-4-3
1981-4-4
1981-4-5
1981-4-6
1981-4-7
1981-4-8
1981-4-9
1981-4-10
1981-4-11
1981-4-12
1981-4-13
1981-4-14
1981-4-15
1981-4-16
1981-4-17
1981-4-18
1981-4-19
1981-4-20
1981-4-21
1981-4-22
1981-4-23
1981-4-24
1981-4-25
1981-4-26
1981-4-27
1981-4-28
1981-4-29
1981-4-30
1981-5-130 rows selected

第五步,根据这些日期得到对应的工作日信息

SQL> 
SQL> with t as2   (select level as id from dual connect by level <= 600),3  t1 as4   (select min(hiredate) as min_hd, max(hiredate) as max_hd5      from emp6     where ename in ('BLAKE', 'JONES')),7  t2 as8   (select min_hd + (t.id - 1) as 日期9      from t, t110     where t.id <= ((max_hd - min_hd) + 1))11  select 日期, to_char(日期, 'DY', 'NLS_DATE_LANGUAGE=American') as dy12    from t2;日期        DY
----------- ---------------------------------------------------------------------------
1981-4-2    THU
1981-4-3    FRI
1981-4-4    SAT
1981-4-5    SUN
1981-4-6    MON
1981-4-7    TUE
1981-4-8    WED
1981-4-9    THU
1981-4-10   FRI
1981-4-11   SAT
1981-4-12   SUN
1981-4-13   MON
1981-4-14   TUE
1981-4-15   WED
1981-4-16   THU
1981-4-17   FRI
1981-4-18   SAT
1981-4-19   SUN
1981-4-20   MON
1981-4-21   TUE
1981-4-22   WED
1981-4-23   THU
1981-4-24   FRI
1981-4-25   SAT
1981-4-26   SUN
1981-4-27   MON
1981-4-28   TUE
1981-4-29   WED
1981-4-30   THU
1981-5-1    FRI30 rows selected

第六步,过滤,把得到的结果汇总就是工作天数。

SQL> with t as2   (select level as id from dual connect by level <= 600),3  t1 as4   (select min(hiredate) as min_hd, max(hiredate) as max_hd5      from emp6     where ename in ('BLAKE', 'JONES')),7  t2 as8   (select min_hd + (t.id - 1) as 日期9      from t, t110     where t.id <= ((max_hd - min_hd) + 1)),11  t3 as12   (select 日期, to_char(日期, 'DY', 'NLS_DATE_LANGUAGE=American') as dy13      from t2)14  select count(*) from t3 where dy not in ('SAT', 'SUN');COUNT(*)
----------22

二、计算—年中周内各日期的次数

比如,计算一年内有多少天是星期一,多少天是星期二等,这个问题需要以下几步。

  1. 取得当前年度信息。
  2. 计算一年有多少天。
  3. 生成日期列表。
  4. 转换为对应的星期标识。
  5. 汇总。

那么接下来看怎么做!

SQL> with t as2   (select to_date('2023-01-01', 'yyyy-mm-dd') as 年初 from dual),3  t1 as4   (select 年初, add_months(年初, 12) as 下年初 from t),5  t2 as6   (select 年初, 下年初, 下年初 - 年初 as 天数 from t1),7  t3 as/*生成列表*/8   (select 年初 + (level - 1) as 日期 from t2 connect by level <= 天数),9  t4 as/*对数据进行转换*/10   (select 日期, to_char(日期, 'DY') as 星期 from t3)11  select 星期, count(*) as 天数 from t4 group by 星期;星期                                                                                天数
--------------------------------------------------------------------------- ----------
星期二                                                                              52
星期六                                                                              52
星期日                                                                              53
星期三                                                                              52
星期四                                                                              52
星期五                                                                              52
星期一                                                                              527 rows selected

三、确定当前记录和下一条记录之间相差的天数

首先需要把下一条记录的雇佣日期作为当前行,这需要用到lead()over()分析函数。

SQL> select deptno,2         ename,3         hiredate,4         lead(hiredate) over(order by hiredate) next_hd5    from emp6   where deptno = 10;DEPTNO ENAME      HIREDATE    NEXT_HD
------ ---------- ----------- -----------10 CLARK      1981-6-9    1981-11-1710 KING       1981-11-17  1982-1-2310 MILLER     1982-1-23   

当数据提取到同一行后,再计算就比较简单:

SQL> with t as (2  select deptno,3         ename,4         hiredate,5         lead(hiredate) over(order by hiredate) next_hd6    from emp7   where deptno = 10)8  select ename,hiredate,next_hd-hiredate diff9  from t;ENAME      HIREDATE          DIFF
---------- ----------- ----------
CLARK      1981-6-9           161
KING       1981-11-17          67
MILLER     1982-1-23   

和lead对应的就是lag函数,如果读者能记住两个函数的区别当然比较好,如果记不住,可直接实验。

SQL> 
SQL> with t as (2  select deptno,3         ename,4         hiredate,5         lag(hiredate) over(order by hiredate) lag_hd,6         lead(hiredate) over(order by hiredate) lead_hd7    from emp8   where deptno = 10)9  select * from t;DEPTNO ENAME      HIREDATE    LAG_HD      LEAD_HD
------ ---------- ----------- ----------- -----------10 CLARK      1981-6-9                1981-11-1710 KING       1981-11-17  1981-6-9    1982-1-2310 MILLER     1982-1-23   1981-11-17  

总结

本章节的三个需求:确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
有些许难度,不过建议还是学会比较好。

相关文章:

【SQL开发实战技巧】系列(十七):时间类型操作(下):确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…...

代码随想录算法训练营第二十八天 | 491.递增子序列,46.全排列,47.全排列 II

一、参考资料递增子序列题目链接/文章讲解&#xff1a;https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1EG4y1h78v 全排列题目链接/文章讲解&#xff1a;https://programmercarl.…...

使用 Three.js 后处理的粗略铅笔画效果

本文使用Three.js的后处理创建粗略的铅笔画效果。我们将完成创建自定义后处理渲染通道、在 WebGL中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。翻译自Codrops&#xff0c;有改动。 Three.js 中的后处理 Three.js中的后处理是一…...

推荐一些不常见的搜索引擎

5.雅虎网来自 Yahoo.com 的屏幕截图&#xff0c;2023 年 2 月截至 2022 年 1 月&#xff0c;Yahoo.com&#xff08;Verizon Media&#xff09;的搜索市场份额为 11.2%。雅虎的优势在于多元化&#xff0c;除搜索外还提供电子邮件、新闻、金融等服务。二十多年来&#xff0c;雅虎…...

RabbitMQ工作模式

目录1.Work queues工作队列模式1.1 模式说明1.2 代码1.3 测试1.4 小结2.订阅模式类型3.Publish/Subscribe发布与订阅模式3.1 模式说明3.2 代码3.3 测试3.4 小结4.Routing路由模式4.1 模式说明4.2 代码4.3 测试4.4 小结5.Topics通配符模式5.1 模式说明5.2 代码5.3 测试5.4 小结6…...

机器学习在预测脊髓型颈椎病中的应用:一项28名参与者的事后初步研究

机器学习在预测脊髓型颈椎病中的应用:一项28名参与者的事后初步研究 Machine Learning for the Prediction of Cervical Spondylotic Myelopathy: A Post Hoc Pilot Study of 28 Participants 简单说&#xff1a;训练了两个模型&#xff1a;1)预测脊髓型颈椎病诊断&#xff0…...

【智能计算数学】微积分

高数问题解决流程引例&#xff1a;回归回归引例&#xff1a;分类分类线性可分FLD线性不可分智能计算讨论范围下降法为什么要用下降法&#xff1f;- 解析解很难写出公式或很复杂难计算有哪些常用的下降法&#xff1f;- 梯度下降&高斯-牛顿法梯度下降&#xff08;Gradient De…...

win10+RTX4070ti+libtorch部署

环境cuda 11.7、cudnn8.6.0、libtorch1.13.1cu117 注意&#xff1a; 1&#xff09;libtorch官网进不去的可直接下载 Release version https://download.pytorch.org/libtorch/cu117/libtorch-win-shared-with-deps-1.13.1%2Bcu117.zip Debug version https://download.pytorch.…...

【Python百日进阶-Web开发-Vue3】Day518 - Vue+ts后台项目5:用户列表

文章目录 一、获取用户列表的数据1.1 定义用户列表和角色列表的接口src/request/api.ts1.2 获取用户列表数据src/views/UserView.vue二、定义用户列表数据类型2.1 src/type/user.ts三、展示用户列表内容3.1 element-plus中的Select 选择器3.2 element-plus中的表格插槽3.3 展示…...

Linux内核转储---kdump原理梳理

文章目录Kexec和Kdump设计的区别kexeckdumpKdump的执行流程kexec的实现用户空间kexec内核空间vmcoreKdump的实现可以分为两部分&#xff1a;内核和用户工具。内核提供机制&#xff0c;用户工具在这些机制上实现各种转储策略&#xff0c;内核机制对用户工具的接口是一个系统调用…...

【C++】从0到1入门C++编程学习笔记 - 实战篇:演讲比赛流程管理系统

文章目录一、演讲比赛程序需求1.1 比赛规则1.2 程序功能1.3 程序效果图&#xff1a;二、项目创建2.1 创建项目2.2 添加文件三、创建管理类3.1创建文件3.2 头文件实现3.3 源文件实现四、菜单功能4.1 添加成员函数4.2 菜单功能实现4.3 测试菜单功能五、退出功能5.1 提供功能接口5…...

04 OpenCV位平面分解

1 基本概念 位平面分解的核心思想是将图像的每一个像素分解为多个二进制位&#xff0c;分别存储在不同的位平面上。例如&#xff0c;如果一个图像是8位深度的&#xff0c;则可以分解为8个位平面&#xff0c;每个位平面上存储一个二进制位。 位平面分解在图像压缩中有着重要的…...

Onvif协议如何判断摄像机支持 —— 筑梦之路

有人就问什么是Onvif协议呢&#xff1f; 全称为&#xff1a;Open Network Video Interface Forum.缩写成Onvif。 翻译过来是&#xff1a;开放型网络视频接口论坛&#xff0c;目的是确保不同安防厂商的视频产品能够具有互通性&#xff0c;这样对整体安防行业才是良性发展。 现…...

情人节new一个对象给你

今天情人节&#xff0c;有没对象的吗&#xff1f;假设你不知道new怎么用&#xff0c;每个人都有两种身份&#xff0c;一种没对象的人&#xff0c;这个时候new一个对象给你&#xff0c;一种是有对象的人&#xff0c;这个delete对象。等你学完这个new和delete知识点&#xff0c;无…...

linux篇【15】:应用层-网络https协议

目录 一.HTTPS介绍 1.HTTPS 定义 2.HTTP与HTTPS &#xff08;1&#xff09;端口不同&#xff0c;是两套服务 &#xff08;2&#xff09;HTTP效率更高&#xff0c;HTTPS更安全 3.加密&#xff0c;解密&#xff0c;密钥 概念 4.为什么要加密&#xff1f; 5.常见的加密方式…...

索引-性能分析-explain

explain 执行计划 explain 执行计划各字段含义 1&#xff09;id 就是代表 sql 的执行顺序或者表的执行顺序&#xff1b;id相同从上往下执行&#xff0c;id不同&#xff0c;id值越大越先执行&#xff1b;&#xff08;注&#xff1a;有子查询时就会出现sql执行顺序&#xff09;…...

mbedtls加密组件使用示例

1 mbedtls aes组件的使用 1.1 AES ECB加解密接口使用 int main(int argc, char *argv[]) {char key[256];char *inbuf calloc(1, 257);char *outbuf calloc(1, 257);char *buf calloc(1,257);char *tmp_outbuf outbuf;char *tmp_buf buf;mbedtls_aes_context aes_ctx;mb…...

如何量测太阳光模拟器的光谱致合度?

太阳模拟器是根据国际法规JIS、IEC60904、美国材料试验协会开发设计的AAA级太阳模拟器。对于100毫米100毫米和200毫米200毫米的光斑尺寸&#xff0c;光斑强度的输出功率范围可以从0.1到1太阳光强度。此外&#xff0c;还提供了灵活的出光方向&#xff0c;以满足用户的研究需求&a…...

网络安全领域中CISP证书八大类都有什么

CISP​注册信息安全专业人员 注册信息安全专业人员&#xff08;Certified Information Security Professional&#xff09;&#xff0c;是经中国信息安全产品测评认证中心实施的国家认证&#xff0c;对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...

17- 梯度提升回归树GBRT (集成算法) (算法)

梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法&#xff0c;它的特点在于纠正与加强&#xff0c;通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题&#xff0c;也可以用于回归问题中。在该模型中&#xff0c;有三个重要参数分别为 n_…...

05 OpenCV色彩空间处理

色彩空间&#xff08;Color Space&#xff09;是一种用于描述颜色的数学模型&#xff0c;它将颜色表示为多维向量或坐标&#xff0c;通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异&#xff0c;不同的…...

【CS224图机器学习】task1 图机器学习导论

前言&#xff1a;本期学习是由datawhale&#xff08;公众号&#xff09;组织&#xff0c;由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习&#xff1f;通过图这种数据结构&#xff0c;对跨模态数据进行整理。…...

Powershell Install SQL Server 2022

前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…...

Jetson NX2 装机过程

1.固态硬盘安装完成后&#xff0c;系统配置 df -h 查看硬盘使用情况 2.查看Jetson NX的IP地址&#xff0c;以下两个都行 ifconfig ip address show 3.Jetson NX2安装arm64的annaconda3&#xff0c;安装有问题报错illegal instruction&#xff0c;未解决。 4.VNC远程登录 …...

初始C++(四):内联函数

文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 二.内联函…...

九、初识卷积

文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时&#xff0c;神经网络的前几层需要完成对图像的边缘检测任务&#xff0c;所谓的边缘检测就是让计算机识别出一张图片的垂直…...

【Linux】【编译】编译调试过程中如何打印出实际的编译命令

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…...

linux安装jdk

step1 下载jdk 到下面的网站下载需要的jdk安装包版本。 Java Downloads | Oracle step2 复制到opt目录 其中user_name对应自己的home目录的用户文件夹 sudo cp /home/user_name//home/czh/Downloads/jdk-17_linux-x64_bin.tar.gz /opt/ step3 到opt目录解压安装包&#xf…...

迅为iTOP-3A5000龙芯开发板安装UOS操作系统

3A5000板卡采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;&#xff0c;市面上龙芯3A5000主板价格都在上万元&#xff0c;可以说是非常贵了&#xff0c; 迅为全新推出了款千元内的iTOP-3A5000开发板,这款板卡各方面的配置也是第…...

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接&#xff1a;https://sysin.org/blog/chrome-firefox-download/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 天下只剩三种&#xff08;主流&am…...

建设公司网站的步骤/百度100%秒收录

org.hibernate.exception.GenericJDBCException: could not get table metadata: 表名 C盘的可用空间不足导致的&#xff0c;只要腾出一些C盘空间可就可正常加载J2EE项目。...

详情页制作网站/沈阳关键词优化费用

定义SynDirTool类&#xff0c;用于同步两个文件夹的内容&#xff0c;从/usr/local/a文件夹到/usr/local/b文件夹&#xff0c;执行方法&#xff1a;python SynDirTool.py /usr/local/a /usr/local/bSynDirTool.py文件内容&#xff1a;#!/usr/bin/python# -*- coding:utf-8 -*-im…...

网站开发师贴吧/周口网站建设公司

最近在开发一对微信服务号&#xff0c;遇到点小坑&#xff0c;特此记录下来提醒自己。 wx.config是必须的&#xff0c;文档里有&#xff0c;不再赘述 wx.ready(function () {wx.onMenuShareAppMessage({title: 这里是标题,desc: 这里是描述,link: qrcode这里是要跳转到的url,im…...

网站建设一般用什么语言好/网站排名工具

多模块、多Web应用合并war包 在日常的系统开发中&#xff0c;如果担心各个系统的资源同名覆盖&#xff0c;可以在总的War模块下放置一份最终的资源。 将版本号改成9.1.0.v20131115&#xff0c;ok 在Idea中的Maven Jetty启动设置&#xff1a; 转载于:https://www.cnblogs.com/su…...

宿迁seo/优化网站找哪家

今天我们的会议如期举行了。这次会议中&#xff0c;我们讨论了第一轮迭代的最后收尾工作。我们打算将前一阶段的任务汇总&#xff0c;把每个人所完成的代码进行合成&#xff0c;进而可以完成一份比较完整的产品。由于第一轮迭代已经完成&#xff0c;第二轮迭代即将开始&#xf…...

网站开发人员名片/如何宣传网站

每一个oracle数据库都有一个控制文件。控制文件是一个小型的二进制文件&#xff0c;可以记录数据库的物理结构&#xff0c;包含以下的内容&#xff1a;数据库名称、相关数据文件和联机重做日志文件的名称和位置、数据库创建的时标、当前日志的序号、检验点信息。 无论何时打开数…...