达梦(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 employee

      WHERE 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-01

SELECT TRUNC (hiredate, 'y') 年初 FROM employee WHERE ROWNUM <= 1;

--计算二月初 2023-02-01

SELECT ADD_MONTHS (TRUNC (hiredate, 'y'), 1) 二月初 FROM employee WHERE ROWNUM <= 1;

--计算二月底  2023-02-28

SELECT 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 x

     AS (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 iw

FROM x;

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

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

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

SELECT NEXT_DAY (TRUNC (hiredate, 'mm') - 1, 2) 第一个周一,

       NEXT_DAY (LAST_DAY (TRUNC (hiredate, 'mm')) - 7, 2) 最后一个周一

FROM employee

WHERE 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 x

     AS (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 x

     AS (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 x

         LEFT JOIN employee e

            ON (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 employee

 WHERE 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 ct

          FROM 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) as

SELECT 1,date '2020-10-01',date '2020-10-02' FROM dual UNION ALL

SELECT 2,date '2020-10-02',date '2020-10-03' FROM dual UNION ALL

SELECT 3,date '2020-10-03',date '2020-10-06' FROM dual UNION ALL

SELECT 4,date '2020-10-06',date '2020-10-07' FROM dual UNION ALL

SELECT 5,date '2020-10-09',date '2020-10-11' FROM dual UNION ALL

SELECT 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) as

SELECT 'HR',datetime '2020-10-01 09:28:00' FROM dual UNION ALL

SELECT 'HR',datetime '2020-10-01 09:38:10' FROM dual UNION ALL

SELECT 'HR',datetime '2020-10-01 10:50:00' FROM dual UNION ALL

SELECT 'HR',datetime '2020-10-01 11:08:50' FROM dual UNION ALL

SELECT 'SYSTEM',datetime '2020-10-01 09:18:00' FROM dual UNION ALL

SELECT '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) as

SELECT 1,date '2020-10-01',date '2020-10-02' FROM dual UNION ALL

SELECT 2,date '2020-10-02',date '2020-10-03' FROM dual UNION ALL

SELECT 3,date '2020-10-03',date '2020-10-06' FROM dual UNION ALL

SELECT 4,date '2020-10-06',date '2020-10-07' FROM dual UNION ALL

SELECT 5,date '2020-10-09',date '2020-10-11' FROM dual UNION ALL

SELECT 6,date '2020-10-13',date '2020-10-15' FROM dual;

SELECT * FROM v;

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

CREATE OR REPLACE VIEW x0

AS

   SELECT 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 x1

AS

   SELECT 编号,

          开始日期,

          结束日期,

          上一工程结束日期,

          CASE WHEN 开始日期 = 上一工程结束日期 THEN 0 ELSE 1 END AS 连续状态 FROM x0;

SELECT * FROM x1;

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

CREATE OR REPLACE VIEW x2

AS

   SELECT 编号,

          开始日期,

          结束日期,

          上一工程结束日期,

          连续状态,

          SUM(连续状态) over(ORDER BY 编号) AS 分组依据

     FROM x1;

SELECT * FROM x2;

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

  SELECT 分组依据,

         MIN (开始日期) AS 开始日期,

         MAX (结束日期) AS 结束日期

    FROM x2

GROUP BY 分组依据

ORDER BY 1;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何通过安全数据传输平台,保护核心数据的安全传输?

在数字化的浪潮中&#xff0c;企业的数据安全传输显得尤为关键。随着网络攻击手段的日益复杂&#xff0c;传统的数据传输方式已不再安全&#xff0c;这就需要我们重视并采取有效的措施&#xff0c;通过安全数据传输平台来保护核心数据。 传统的数据传输面临的主要问题包括&…

Bun 入门到精通(一)

Bun 是什么&#xff1f; Bun 是用于 JavaScript 和 TypeScript 应用程序的多合一工具包。它作为一个名为 bun 的可执行文件提供。 其核心是 Bun 运行时&#xff0c;这是一个快速的 JavaScript 运行时&#xff0c;旨在替代 Node.js。它是用 Zig 编写的&#xff0c;并由 JavaSc…

数字文旅重塑旅游发展新格局:以数字化转型为突破口,提升旅游服务的智能化水平,为游客带来全新的旅游体验

随着信息技术的迅猛发展&#xff0c;数字化已成为推动各行各业创新发展的重要力量。在旅游业领域&#xff0c;数字文旅的兴起正以其强大的驱动力&#xff0c;重塑旅游发展的新格局。数字文旅以数字化转型为突破口&#xff0c;通过提升旅游服务的智能化水平&#xff0c;为游客带…

C#基础|OOP、类与对象的认识

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 所有的面向对象的编程语言&#xff0c;都是把我们要处理的“数据”和“行为”封装到类中。 以下为OOP的学习笔记。 01 什么是面向对象编程&#xff08;OOP&#xff09;&#xff1f; 设计类&#xff1a;就是根据需求设计…

论文精读InstructPix2Pix: Learning to Follow Image Editing Instructions

InstructPix2Pix: Learning to Follow Image Editing Instructions 我们提出了一种根据人类指令编辑图像的方法:给定输入图像和告诉模型该做什么的书面指令&#xff0c;我们的模型遵循这些指令来编辑图像。 为了获得这个问题的训练数据&#xff0c;我们结合了两个大型预训练模…

输入输出重定向,追加重定向(Linux)

文章目录 一、输出重定向二、追加重定向三.输入重定向总结 一、输出重定向 我们在使用echo内容时&#xff0c;会把内容显示在显示器上。 echo自动换行。 我们如果输入 echo “hello linux” >file.txt 我们运行一下就会发现系统中多了一个file.txt的文件&#xff0c;如果这…

C语言 基本数据类型及大小

一、基本数据类型 1.整型int 整型的关键字是int&#xff0c;定义一个整型变量时&#xff0c;只需要用int来修饰即可。也分为短整型和长整型。 2.浮点型 浮点型又分单精度浮点型float和双精度浮点型double。 3.字符型char 前面的整型和浮点型都是用于存放数字。字符型&…

代理IP纯净度,对用户居然这么重要!

在网络应用和数据采集等领域&#xff0c;代理IP被广泛使用&#xff0c;而代理IP的纯净度则直接影响其性能和可用性。代理IP的纯净度主要涉及到代理IP在网络传输过程中的稳定性、匿名性和安全性。今天就带大家一起了解代理IP纯净度对用户的重要性。 第一&#xff0c;保护用户的隐…

什么是物理机什么是虚拟机 2024年6款适用于Windows的虚拟机软件推荐 crossover Parallels Desktop Mac运行exe

虚拟化是创建虚拟版本的过程&#xff0c;例如桌面、服务器或网络。它在物理上并不存在&#xff0c;但似乎确实存在。这种环境的虚拟版本可用于多种用途&#xff0c;包括测试和开发、灾难恢复和工作负载整合。虚拟化软件&#xff0c;也称为虚拟机 (VM) 软件&#xff0c;是一种允…

机器学习理论基础—贝叶斯分类器

机器学习理论基础—贝叶斯分类器 贝叶斯决策论 概述&#xff1a;贝叶斯决策论是概率框架下实施决策的基本方法&#xff0c;对分类任务来说&#xff0c;在所有相关概率都已知的理想情形下&#xff0c;贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。 定义 …

HarmonyOS开发案例:【 自定义弹窗】

介绍 基于ArkTS的声明式开发范式实现了三种不同的弹窗&#xff0c;第一种直接使用公共组件&#xff0c;后两种使用CustomDialogController实现自定义弹窗&#xff0c;效果如图所示&#xff1a; 相关概念 [AlertDialog]&#xff1a;警告弹窗&#xff0c;可设置文本内容和响应回…

LangChain入门:24.通过Baby AGI实现自动生成和执行任务

随着 ChatGPT 的崭露头角,我们迎来了一种新型的代理——Autonomous Agents(自治代理或自主代理)。 这些代理的设计初衷就是能够独立地执行任务,并持续地追求长期目标。 在 LangChain 的代理、工具和记忆这些组件的支持下,它们能够在无需外部干预的情况下自主运行,这在真…

Mac下使用homebrew管理多版本mysql同时启动

Mac下使用homebrew管理多版本mysql同时启动 思路 给每个版本分配不同的数据目录和配置文件即可 本文尝试了使用 brew 安装管理多个MySQL版本&#xff0c;同时运行、直接切换 安装 如果已有数据文件请自行备份以及使用 安装 mysql 5.7 brew install mysql5.7在 /opt/home…

银狐样本分析

银狐病毒 概述 msi在安装过程中执行恶意脚本&#xff0c;在C盘释放载荷ee.exe&#xff0c;ee.exe解密执行shellcode&#xff0c;shellcode通过多种手段执行反调试操作&#xff0c;添加Windows Defender的排除路径&#xff0c;解密字符串获取url后建立连接下载文件并解密&…

从递归角度串联二叉树-图论-动态规划

一、深度理解二叉树的前中后序遍历 二叉树遍历框架如下&#xff1a; void traverse(TreeNode* root) {if (root nullptr) {return;}// 前序位置traverse(root->left);// 中序位置traverse(root->right);// 后序位置 }先不管所谓前中后序&#xff0c;单看 traverse 函数…

Linux系统安全与应用【二】

目录 1.开关机安全控制 1.2 实例&#xff1a;GRUB 菜单设置密码 2.终端登录安全控制 2.1 限制root只在安全终端登录 ​3.弱口令检测 3.1 Joth the Ripper,JR​编辑 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情况下在系统…

【源码】WBF多语言交易所/申购+自发币平台币+币币+杠杆+合约/附带安装教程/带VUE工程源码

【源码介绍】 WBF多语言交易所/申购自发币平台币币币杠杆合约/附带安装教程/带VUE工程源码 【源码说明】 带VUE工程源码最新申购&#xff0c;自发币平台币&#xff0c;币币&#xff0c;法币&#xff0c;杠杆&#xff0c;合约多语言交易所&#xff0c;附带pc和手机VUE&#x…

本地认证的密码去哪了?怎么保证安全的?

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff1f;密文存在哪个文件下?该文件是否可以打开&#xff0c;并且查看到密文&#xff1f; 系统将输入的明文密码通过hash算法转为哈希值&#xff0c;且输入的值会在内存中立即删除无法查看。 然后将密文存放在C:…

基础SQL DQL语句

基础查询 select * from 表名; 查询所有字段 create table emp(id int comment 编号,workno varchar(10) comment 工号,name varchar(10) comment 姓名,gender char(1) comment 性别,age tinyint unsigned comment 年龄,idcard char(18) comment 身份证号,worka…

贪吃蛇大作战【纯c语言】

如果有看到不懂的地方或者对c语言某些知识忘了的话&#xff0c;可以找我之前的文章哦&#xff01;&#xff01;&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;c语言_小八哥向前冲~的博客-CSDN博客 贪吃蛇游戏演示&#xff1a; 贪吃蛇游戏动画演…