【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,min与group 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
二、计算—年中周内各日期的次数
比如,计算一年内有多少天是星期一,多少天是星期二等,这个问题需要以下几步。
- 取得当前年度信息。
- 计算一年有多少天。
- 生成日期列表。
- 转换为对应的星期标识。
- 汇总。
那么接下来看怎么做!
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开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…...
代码随想录算法训练营第二十八天 | 491.递增子序列,46.全排列,47.全排列 II
一、参考资料递增子序列题目链接/文章讲解:https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v 全排列题目链接/文章讲解:https://programmercarl.…...
使用 Three.js 后处理的粗略铅笔画效果
本文使用Three.js的后处理创建粗略的铅笔画效果。我们将完成创建自定义后处理渲染通道、在 WebGL中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。翻译自Codrops,有改动。 Three.js 中的后处理 Three.js中的后处理是一…...
推荐一些不常见的搜索引擎
5.雅虎网来自 Yahoo.com 的屏幕截图,2023 年 2 月截至 2022 年 1 月,Yahoo.com(Verizon Media)的搜索市场份额为 11.2%。雅虎的优势在于多元化,除搜索外还提供电子邮件、新闻、金融等服务。二十多年来,雅虎…...
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 简单说:训练了两个模型:1)预测脊髓型颈椎病诊断࿰…...
【智能计算数学】微积分
高数问题解决流程引例:回归回归引例:分类分类线性可分FLD线性不可分智能计算讨论范围下降法为什么要用下降法?- 解析解很难写出公式或很复杂难计算有哪些常用的下降法?- 梯度下降&高斯-牛顿法梯度下降(Gradient De…...
win10+RTX4070ti+libtorch部署
环境cuda 11.7、cudnn8.6.0、libtorch1.13.1cu117 注意: 1)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的实现可以分为两部分:内核和用户工具。内核提供机制,用户工具在这些机制上实现各种转储策略,内核机制对用户工具的接口是一个系统调用…...
【C++】从0到1入门C++编程学习笔记 - 实战篇:演讲比赛流程管理系统
文章目录一、演讲比赛程序需求1.1 比赛规则1.2 程序功能1.3 程序效果图:二、项目创建2.1 创建项目2.2 添加文件三、创建管理类3.1创建文件3.2 头文件实现3.3 源文件实现四、菜单功能4.1 添加成员函数4.2 菜单功能实现4.3 测试菜单功能五、退出功能5.1 提供功能接口5…...
04 OpenCV位平面分解
1 基本概念 位平面分解的核心思想是将图像的每一个像素分解为多个二进制位,分别存储在不同的位平面上。例如,如果一个图像是8位深度的,则可以分解为8个位平面,每个位平面上存储一个二进制位。 位平面分解在图像压缩中有着重要的…...
Onvif协议如何判断摄像机支持 —— 筑梦之路
有人就问什么是Onvif协议呢? 全称为:Open Network Video Interface Forum.缩写成Onvif。 翻译过来是:开放型网络视频接口论坛,目的是确保不同安防厂商的视频产品能够具有互通性,这样对整体安防行业才是良性发展。 现…...
情人节new一个对象给你
今天情人节,有没对象的吗?假设你不知道new怎么用,每个人都有两种身份,一种没对象的人,这个时候new一个对象给你,一种是有对象的人,这个delete对象。等你学完这个new和delete知识点,无…...
linux篇【15】:应用层-网络https协议
目录 一.HTTPS介绍 1.HTTPS 定义 2.HTTP与HTTPS (1)端口不同,是两套服务 (2)HTTP效率更高,HTTPS更安全 3.加密,解密,密钥 概念 4.为什么要加密? 5.常见的加密方式…...
索引-性能分析-explain
explain 执行计划 explain 执行计划各字段含义 1)id 就是代表 sql 的执行顺序或者表的执行顺序;id相同从上往下执行,id不同,id值越大越先执行;(注:有子查询时就会出现sql执行顺序)…...
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毫米的光斑尺寸,光斑强度的输出功率范围可以从0.1到1太阳光强度。此外,还提供了灵活的出光方向,以满足用户的研究需求&a…...
网络安全领域中CISP证书八大类都有什么
CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional),是经中国信息安全产品测评认证中心实施的国家认证,对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...
17- 梯度提升回归树GBRT (集成算法) (算法)
梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题,也可以用于回归问题中。在该模型中,有三个重要参数分别为 n_…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
