达梦(DM) SQL日期操作及分析函数

达梦DM SQL日期操作及分析函数

  • 日期操作
    • SYSDATE
    • EXTRACT
    • 判断一年是否为闰年
    • 周的计算
    • 确定某月内第一个和最后一个周末某天的日期
    • 确定指定年份季度的开始日期和结束日期
    • 补充范围内丢失的值
    • 按照给定的时间单位查找
    • 使用日期的特殊部分比较记录
  • 范围处理
    • 分析函数
    • 定位连续值的范围
    • 查找同一分区中行之间的差
    • 定位连续范围的起始点

本文主要讲述DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理。

日期操作

SYSDATE

使用 trunc() 函数获得某个日期对应的月初时间

SELECT ename,hiredate AS 入职日期,TRUNC (hiredate, 'mm') AS 月初 FROM employee WHERE ROWNUM <= 1;

在这里插入图片描述
获取具体时间的时分秒、年月日、月初、周初、年初等

SELECT hiredate,TO_NUMBER (TO_CHAR (hiredate, 'hh24')),TO_NUMBER (TO_CHAR (hiredate, 'mi')),TO_NUMBER (TO_CHAR (hiredate, 'ss')),TO_NUMBER (TO_CHAR (hiredate, 'dd')),TO_NUMBER (TO_CHAR (hiredate, 'mm')),TO_NUMBER (TO_CHAR (hiredate, 'yyyy')),TO_NUMBER (TO_CHAR (hiredate, 'ddd')) 年内第几天,TRUNC (hiredate, 'dd') 一天之始,TRUNC (hiredate, 'day') 周初,TRUNC (hiredate, 'mm') 月初,LAST_DAY (hiredate) 月末,ADD_MONTHS (TRUNC (hiredate, 'mm'), 1) 下月初,TRUNC (hiredate, 'yy') 年初,TO_CHAR (hiredate, 'day') 周几,TO_CHAR (hiredate, 'month') 月份FROM (SELECT hiredate FROM employeeWHERE ROWNUM <= 1); 

在这里插入图片描述

EXTRACT

EXTRACT 函数可以提取时间字段中的年、月、日、时、分、秒,返回的值为 NUMBER 类型

SELECT EXTRACT (YEAR FROM SYSTIMESTAMP) AS,EXTRACT (MONTH FROM SYSTIMESTAMP) AS,EXTRACT (DAY FROM SYSTIMESTAMP) AS,EXTRACT (HOUR FROM SYSTIMESTAMP) AS,EXTRACT (MINUTE FROM SYSTIMESTAMP) AS,EXTRACT (SECOND FROM SYSTIMESTAMP) ASFROM DUAL;

在这里插入图片描述
to_char 函数可以用来取日期时间类型字段中的时、分、秒

SELECT hiredate, TO_CHAR (hiredate, 'dd') AS, TO_CHAR (hiredate, 'hh24') ASFROM employee WHERE ROWNUM <= 1;

在这里插入图片描述
EXTRACT 函数可以用来取 INTERVAL 中的信息,to_char 函数不支持

SELECT EXTRACT (HOUR FROM it) AS "hour" FROM (SELECT INTERVAL '2 12:30:59' DAY TO SECOND AS it FROM DUAL);

在这里插入图片描述
换成to_char函数

SELECT to_char(it,'hh24') AS "hour" FROM (SELECT INTERVAL '2 12:30:59' DAY TO SECOND AS it FROM DUAL);

在这里插入图片描述

判断一年是否为闰年

判断一年是否为闰年,可以看二月的月末具体是哪一天。使用 TO_CHAR、 LAST_DAY、 ADD_MONTHS、 TRUNC 函数共同实现

--计算年初  2023-01-01SELECT TRUNC (hiredate, 'y') 年初 FROM employee WHERE ROWNUM <= 1;--计算二月初 2023-02-01SELECT ADD_MONTHS (TRUNC (hiredate, 'y'), 1) 二月初 FROM employee WHERE ROWNUM <= 1;--计算二月底  2023-02-28SELECT LAST_DAY (ADD_MONTHS (TRUNC (hiredate, 'y'), 1)) AS 二月底 FROM employee WHERE ROWNUM <= 1;--计算二月底对应的日期SELECT TO_CHAR (LAST_DAY (ADD_MONTHS (TRUNC (hiredate, 'y'), 1)), 'DD') ASFROM employee WHERE ROWNUM <= 1;

在这里插入图片描述

周的计算

使用 TO_CHAR、 NEXT_DAY、TRUNC 函数共同实现周的计算

WITH xAS (SELECT TRUNC (SYSDATE, 'yy') + (LEVEL - 1) AS 日期 FROM DUAL CONNECT BY LEVEL <= 8)SELECT 日期,TO_CHAR (日期, 'd') AS d,TO_CHAR (日期, 'day') AS day,NEXT_DAY (日期, 1) AS 下个周日,TO_CHAR (日期, 'ww') AS ww,TO_CHAR (日期, 'iw') AS iwFROM x;

在这里插入图片描述
参数 “day” 与字符集无关,所以建议使用 “d”, WW 与 IW 都是取 “第几周”,只是两个参数的初始值不一样。

确定某月内第一个和最后一个周末某天的日期

返回当月内第一个星期一与最后一个星期一,我们分别找上月末及当月末之前七天的下一周的周一即可

SELECT NEXT_DAY (TRUNC (hiredate, 'mm') - 1, 2) 第一个周一,NEXT_DAY (LAST_DAY (TRUNC (hiredate, 'mm')) - 7, 2) 最后一个周一FROM employeeWHERE ROWNUM <= 1;

在这里插入图片描述

确定指定年份季度的开始日期和结束日期

在写报表查询语句时需要按季度分类汇总,提取对应的季度开始日期和结束日期。可以通过 add_months、to_date 函数实现

SELECT sn AS 季度, (sn - 1) * 3 + 1 AS 开始月份, ADD_MONTHS (TO_DATE (, 'yyyy'), (sn - 1) * 3) AS 开始日期, ADD_MONTHS (TO_DATE (, 'yyyy'), sn * 3)-1 AS 结束日期FROM (SELECT '2023' AS, LEVEL AS sn FROM DUAL CONNECT BY LEVEL <= 4);

在这里插入图片描述

补充范围内丢失的值

统计每一年份入职员工数,若表中没有的年份,则展示的统计人数为 0

WITH xAS (SELECT 开始年份 + (LEVEL - 1) AS 年份FROM (SELECT EXTRACT (YEAR FROM MIN (hiredate)) AS 开始年份,EXTRACT (YEAR FROM MAX (hiredate)) AS 结束年份FROM employee)CONNECT BY LEVEL <= 结束年份 - 开始年份 + 1)SELECT * FROM x;

在这里插入图片描述
关联查询得到结果集

WITH xAS (SELECT 开始年份 + (LEVEL - 1) AS 年份FROM (SELECT EXTRACT (YEAR FROM MIN (hiredate)) AS 开始年份,EXTRACT (YEAR FROM MAX (hiredate)) AS 结束年份FROM employee)CONNECT BY LEVEL <= 结束年份 - 开始年份 + 1)SELECT x.年份, COUNT (e.empno) 入职人数FROM xLEFT JOIN employee eON (EXTRACT (YEAR FROM e.hiredate) = x.年份)GROUP BY x.年份ORDER BY 1;

在这里插入图片描述

按照给定的时间单位查找

使用 to_char 函数查询给定时间单位的时间,比如查询如入职日期在 1 月或者 11 月且非星期三的员工信息

SELECT ename 姓名,hiredate 入职日期,TO_CHAR (hiredate, 'day') AS 星期FROM employeeWHERE TO_CHAR (hiredate, 'mm') IN ('01', '11')AND TO_CHAR (hiredate, 'd') != '4';

在这里插入图片描述

使用日期的特殊部分比较记录

使用 to_char 函数统计相同月份与周内日期入职的员工

SELECT ename 姓名,hiredate 入职日期,TO_CHAR (hiredate, 'MON day') AS 月周FROM (SELECT ename, hiredate, COUNT (*) OVER (PARTITION BY TO_CHAR (hiredate, 'MON day')) AS ctFROM employee)WHERE hiredate LIKE '2023%';

在这里插入图片描述

范围处理

分析函数

lead(列名,n,m) over(partition by … order by …),不带参数 n,m,则查找当前记录后面第一行的记录列名的值,参数说明

lead() 只能用于取后面第 n 行记录说明,不能取前面的。如果要取前面第 n 行记录说明,使用 lag()函数。over() 在什么条件之上,使用语法 over(partition by...order by...)。partition by 按某个字段划分组。order by 按某个字段排序。

定位连续值的范围

可以使用分析函数 lead() over() 定位某一段连续值的范围

CREATE OR REPLACE VIEW v(pro_id,pro_start,pro_end) asSELECT 1,date '2020-10-01',date '2020-10-02' FROM dual UNION ALLSELECT 2,date '2020-10-02',date '2020-10-03' FROM dual UNION ALLSELECT 3,date '2020-10-03',date '2020-10-06' FROM dual UNION ALLSELECT 4,date '2020-10-06',date '2020-10-07' FROM dual UNION ALLSELECT 5,date '2020-10-09',date '2020-10-11' FROM dual UNION ALLSELECT 6,date '2020-10-13',date '2020-10-15' FROM dual;SELECT * FROM v;

查看创建的视图v
在这里插入图片描述
现在需要查询连续值记录,即下一行记录的开始时间与上一行记录的结束时间一致

SELECT 工程号, 开始日期, 结束日期FROM (SELECT pro_id AS 工程号,pro_start AS 开始日期,pro_end AS 结束日期,LEAD (pro_start) OVER (ORDER BY pro_id) 下一工程开始日期FROM v)WHERE 下一工程开始日期 = 结束日期;

在这里插入图片描述

查找同一分区中行之间的差

可以使用分析函数 lead() over() 查找同一分区中行之间的差

CREATE OR REPLACE VIEW v(log_name,log_time) asSELECT 'HR',datetime '2020-10-01 09:28:00' FROM dual UNION ALLSELECT 'HR',datetime '2020-10-01 09:38:10' FROM dual UNION ALLSELECT 'HR',datetime '2020-10-01 10:50:00' FROM dual UNION ALLSELECT 'HR',datetime '2020-10-01 11:08:50' FROM dual UNION ALLSELECT 'SYSTEM',datetime '2020-10-01 09:18:00' FROM dual UNION ALLSELECT 'SYSTEM',datetime '2020-10-01 12:09:40' FROM dual;SELECT * FROM v;

创建视图v
在这里插入图片描述
现在需要各用户两次登录的时间间隔,首先使用分析函数 lead() over() 取出下一行信息

SELECT log_name AS 登录名,log_time AS 登录时间,LEAD (log_time) OVER (PARTITION BY log_name ORDER BY log_time) 下一登录时间FROM v;

在这里插入图片描述
计算用户两次登录的时间间隔

SELECT log_name AS 登录名, log_time AS 登录时间, (next_log_time - log_time) * 24 * 60 AS 登录间隔FROM (SELECT log_name, log_time, LEAD (log_time) OVER (PARTITION BY log_name ORDER BY log_time) next_log_time FROM v);

在这里插入图片描述

定位连续范围的起始点

创建视图v

CREATE OR REPLACE VIEW v(pro_id,pro_start,pro_end) asSELECT 1,date '2020-10-01',date '2020-10-02' FROM dual UNION ALLSELECT 2,date '2020-10-02',date '2020-10-03' FROM dual UNION ALLSELECT 3,date '2020-10-03',date '2020-10-06' FROM dual UNION ALLSELECT 4,date '2020-10-06',date '2020-10-07' FROM dual UNION ALLSELECT 5,date '2020-10-09',date '2020-10-11' FROM dual UNION ALLSELECT 6,date '2020-10-13',date '2020-10-15' FROM dual;SELECT * FROM v;

在这里插入图片描述
要求把连续的项目合并,返回合并后的起始时间,首先提取上一个工程结束时间

CREATE OR REPLACE VIEW x0ASSELECT pro_id AS 编号,pro_start AS 开始日期,pro_end AS 结束日期,LAG (pro_end) OVER (ORDER BY pro_id) AS 上一工程结束日期FROM v;SELECT * FROM x0;

在这里插入图片描述
标定项目的连续状态

CREATE OR REPLACE VIEW x1ASSELECT 编号,开始日期,结束日期,上一工程结束日期,CASE WHEN 开始日期 = 上一工程结束日期 THEN 0 ELSE 1 END AS 连续状态 FROM x0;SELECT * FROM x1;

在这里插入图片描述
从结果图看出,每个连续分组的开始,都生成了一个“1”的标识,对位置状态进行累加,得到分组依据

CREATE OR REPLACE VIEW x2ASSELECT 编号,开始日期,结束日期,上一工程结束日期,连续状态,SUM(连续状态) over(ORDER BY 编号) AS 分组依据FROM x1;SELECT * FROM x2;

在这里插入图片描述
通过提取数据、生成标识、累加标识这些操作后,得到了需要的 3 个连续分组

  SELECT 分组依据,MIN (开始日期) AS 开始日期,MAX (结束日期) AS 结束日期FROM x2GROUP BY 分组依据ORDER BY 1;

在这里插入图片描述
到这里基于DM 数据库中如何实现各种日期相关的运算以及如何利用分析函数 lead() over() 进行范围问题的处理也就算说完了,下面继续进行后续的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++系列-输入输出

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C输入和输出 我们都知道C语言的输出是用printf函数来实现的&#xff0c;那么C呢&#xff0c;它的实现逻辑是什么呢&#xff0c;让我们一起来看一下&#xff0c; #include<i…

docker入门级命令

基本概念 docker的连个基本概念&#xff1a;镜像、容器。 docker镜像可以理解为是存储docker安装包的地方&#xff0c;比如&#xff1a;mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。 可以通过docker pull命令拉取远程镜像到本地。比如&#xff1a;…

Linux系统安全及应用(1)

目录 一.账号安全控制 系统账号清理 二.密码安全控制 密码安全控制 三.命令历史限制 命令历史限制 四.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 ​编辑五.PAM认证的构成 六.使用sudo机制提升权限…

IDEA离线安装插件

1、下载地址 https://plugins.jetbrains.com/idea 如果去其他编辑器&#xff0c;点击下拉&#xff0c;选择即可。 2.搜索 在输入框输入关键词&#xff0c;按照提示选择即可&#xff0c;点击搜索按钮&#xff0c;查看结果。 3、选择版本 按照自己的版本选择合适的版本 4、安…

linux的SSH(远程登录)服务

目录 1.SSH远程管理 1.1 SSH的概述 1.2 OpenSSH服务器 1.3 SSH端口、配置文件 2.服务端重要配置 3.登录验证方式 3.1 密码验证 3.2 密钥对验证 4.使用 SSH 客户端程序 4.1 ssh 远程登录 4.2 scp 远程复制 4.3 sftp文件传输 5.创建使用密钥对 6.TCP Wrappers访问控…

CLIP论文笔记:Learning Transferable Visual Models From Natural Language Supervision

导语 会议&#xff1a;ICML 2021链接&#xff1a;https://proceedings.mlr.press/v139/radford21a/radford21a.pdf 当前的计算机视觉系统通常只能识别预先设定的对象类别&#xff0c;这限制了它们的广泛应用。为了突破这一局限&#xff0c;本文探索了一种新的学习方法&#x…

sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Linux线程(pthread)概念以及编程

pthread 线程的意思 1.简的来说&#xff0c;线程的概念就是在一个程序中&#xff0c;同时进行多个函数的运行比如以下代码 2.要引入头文件#include <pthread.h> ; 线程被调函数的定义是空指针类型的如&#xff1a; void *func1() 在main函数中&#xff0c;pthread_cre…

【软件】ERETCAD-Env:在轨空间环境3D动态仿真软件

文章介绍了Extreme-environment Radiation Effect Technology Computer-Aided Design – Environment (ERETCAD-Env)软件&#xff0c;文章的介绍和展示了ERETCAD-Env软件的功能和特点&#xff0c;这是一款用于动态模拟在轨卫星所处空间环境的计算机辅助设计软件。强调了该软件在…

Rust异步并发编程tokio异步运行时讲解和使用,新手必学

Rust 在v1.39版本以后就引入了async关键字&#xff0c;用于支持异步编程。 async fn foo() {}Rust中&#xff0c;async函数或块会被视作一个 Future 对象&#xff0c;async 关键字只是用来定义这个 Future 对象&#xff0c;定义好的这片异步代码并不会自动执行&#xff0c;而是…

c语言指针的应用场景

​ 1.什么是指针&#xff1f; 当我们提起指针的时候&#xff0c;可能第一反应会露出惊喜的表情 &#xff08;但是我们其实没必要那么慌&#xff0c;因为当我们随着我们学习的越来越深入就会发现&#xff0c;指针虽然看起来难&#xff0c;实际上也不怎么简单。哈哈哈开玩笑的&a…

TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测

文章目录 效果一览文章概述 订阅专栏只能获取一份代码部分源码参考资料 效果一览 文章概述 TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测 matlab2021 订阅专栏只能获取一份代码 部分源码 %------------------------------------------------------------------…

c# winform打包

本次采用vs2022打包winform窗体应用&#xff0c;有时应用不需要打包为安装应用&#xff0c;执行一个EXE就运行了 测试了几次&#xff0c;winform 非.net Framework 和控制台程序也是非.net Framework项目能打包这种&#xff0c;后续在研究

边缘计算在视频监控领域的应用

一、边缘计算在视频监控领域的应用 运用边缘计算解决视频监控问题&#xff0c;可以带来许多优势。以下是一些具体的应用示例&#xff1a; 实时分析与处理&#xff1a;在视频监控系统中&#xff0c;边缘计算盒子可以实时处理和分析视频流&#xff0c;实现对监控画面的智能识别…

STM32H7 HSE时钟的使用方法介绍

目录 概述 1 STM32H750 HSE时钟介绍 2 使用STM32Cube创建Project 3 认识HSE时钟 3.1 HSE时钟的特性 3.2 HSE的典型应用电路 4 STM32Cube中配置时钟 4.1 时钟需求 4.2 配置参数 4.2.1 使能外围资源 4.2.2 使用STM32Cube注意项 4.2.3 配置参数 5 总结 概述 本文主要…

IBM SPSS Statistics for Mac v27.0.1中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具&#xff0c;为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac v27.0.1中文激活版下载 该软件拥有丰富的统计分析功能&#xff0c;无论是描述性统计、推论性统计&#xff0c;还是高级的多元统计…

论文解读:(CAVPT)Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model

v1文章名字&#xff1a;Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model v2文章名字&#xff1a;Class-Aware Visual Prompt Tuning for Vision-Language Pre-Trained Model 文章汇总 对该文的改进&#xff1a;论文解读&#xff1a;(VPT)Visual Prompt …

Visual Studio 对 C++ 头文件和模块的支持

在 C 编程领域&#xff0c;头文件和模块的管理有时候确实比较令人头疼。但是&#xff0c;有许多工具和功能可以简化此过程&#xff0c;提高效率并减少出错的可能性。下面是我们为 C 头文件和模块提供的几种工具的介绍。 构建明细 通过菜单栏 Build > Run Build Insights&a…

【个人博客搭建】(11)swagger添加jwt信息

这个主要是为了方便使用swagger时&#xff0c;能更好的带入我们的token。 ps&#xff1a;如果使用其他第三方api工具&#xff08;apipost、postman等&#xff09;则不需要。 &#xff08;当然&#xff0c;不用不能没有&#xff0c;是吧&#xff09; 1、在AddSwaggerGen内添加…

本地Windows主机,使用pycharm通过wsl的ubuntu来创建django项目

Windows主机在pycharm中通过wsl的ubuntu来创建django项目 需求&#xff1a;在windows主机中创建python项目再转接到linux服务器中运行&#xff0c;有点麻烦。【特别是存放日志文件或其他文件路径时需要修改为linux中的路径】 1&#xff1a;我的是windows主机 2&#xff1a;有…