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

news2024/12/24 10:26:51

达梦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() 进行范围问题的处理也就算说完了,下面继续进行后续的操作。

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

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

相关文章

【定制化体验:使用Spring Boot自动配置,打造个性化Starter】

项目结构 Pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…

LabVIEW高效目标跟踪系统

LabVIEW高效目标跟踪系统 随着机器视觉技术的飞速发展&#xff0c;设计和实现高效的目标跟踪系统成为了众多领域关注的焦点。基于LabVIEW平台&#xff0c;结合NI Vision机器视觉库&#xff0c;开发了一种既高效又灵活的目标跟踪系统。通过面向对象编程方法和队列消息处理器程序…

【CTF Crypto】CTFShow 萌新 密码3 Writeup(摩尔斯电码+培根密码)

萌新 密码3 3 题目名称&#xff1a;我想吃培根 题目描述&#xff1a; – — .-. … . …–.- … … …–.- -.-. — — .-… …–.- -… …- - …–.- -… .- -.-. — -. …–.- … … …–.- -.-. — — .-… . .-. …–.- – – -… -… – -… – -… – – – -… -… -……

鸿蒙(HarmonyOS)性能优化实战-Trace使用教程

概述 OpenHarmony的DFX子系统提供了为应用框架以及系统底座核心模块的性能打点能力&#xff0c;每一处打点即是一个Trace&#xff0c;其上附带了记录执行时间、运行时格式化数据、进程或线程信息等。开发者可以使用SmartPerf-Host调试工具对Trace进行解析&#xff0c;在其绘制…

yudao-cloud微服务系统系统模块+后台管理系统成功运行

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 第一章 芋…

精酿啤酒:酿造工艺的自动化与智能化发展

随着科技的不断进步&#xff0c;自动化与智能化已成为啤酒酿造工艺的重要发展方向。Fendi Club啤酒紧跟时代潮流&#xff0c;积极推动酿造工艺的自动化与智能化发展&#xff0c;旨在提高生产效率、确保产品品质和满足市场需求。 Fendi Club啤酒引入自动化生产设备。他们采用自动…

rabbitmq集群配置

1&#xff0c;配置环境变量 MY_POD_NAME&#xff1a;当前Pod的名称 RABBITMQ_ERLANG_COOKIE&#xff1a;设置Erlang Cookie用于节点间通信安全验证&#xff0c;值来自/nfs/rabbitmq/lib/.erlang.cookie文件内容 RABBITMQ_NODENAME&#xff1a;根据Pod名称动态生成了RabbitMQ…

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器&#xff0c;它以其简洁的界面和强大的功能&#xff0c;成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式&#xff0c;用户无需关心复杂的M…

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

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

TCP关闭连接时的一些思考

TCP协议是TCP/IP栈中最复杂的协议&#xff0c;它最大的优点是传输的可靠性&#xff0c;这通过面向连接、按序传输、超时重传、流量控制等机制保证其传输的可靠性。但这并不是我们今天要讨论的重点&#xff01; TCP通信的过程分别是三个阶段&#xff1a;建立连接、传输数据、关…

SpringCloud Hystrix 实战

一、配置 1.引入jar包 单独使用hystrix &#xff0c;不配合openFegin使用的话&#xff0c;单独使用hystrix,需要引入spring-cloud-starter-netflix-hystrix包。要使用的hystrix-dashboard 界面的话需要引入spring-boot-starter-actuator 包和spring-cloud-starter-netflix-hy…

SpringBoot中多数据源灵活切换解决方案

本篇内容介绍了“SpringBoot中如何使用Dynamic Datasource配置多数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 源码地址/文档说明 功能特性: 支持 数据源分组…

通信原理(2)--随机过程

通信原理(2)–随机过程 3.1随机过程的基本概念 随机过程{x(t)}由一族时间函数 x i ( t ) x_i(t) xi​(t)&#xff0c;i1,2.3…组成&#xff0c;每一个时间函数 x i ( t ) x_i(t) xi​(t)称为随机过程{x(t)}的一个样本函数&#xff08;一个实现&#xff09; 每个样本函数在时间…

python-opencv实现最近邻插值和双线性插值对图片上采样

使用背景 当我们需要把图像进行放大或者缩小的时候&#xff0c;第一反应是使用resize()实现。很多情况下&#xff0c;我们会调用最近邻插值和双线性插值去放大图片&#xff0c;当然要说没有分辨率的损失那是不可能的&#xff0c;只能说在放大图片的过程中尽可能增加了图片的分…

Hybrid Homomorphic Encryption:SE + HE

参考文献&#xff1a; [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[MJS16] Maux P, Journault A, Standaert F X, et al. To…

Matlab|交直流系统潮流计算(含5种控制模式)

目录 1 主要内容 程序参考流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《交直流系统潮流计算及相互关联特性分析》&#xff0c;采用5种交直流潮流控制方式&#xff1a;1.定电流定电压 2.定电流定熄弧角 3.定功率定电压 4.定功率定熄弧角 5.定触发角…

Stable Diffusion 常用放大算法详解

常用放大算法 图像放大算法大致有两种&#xff1a; 传统图像放大算法&#xff08;Lantent、Lanczos、Nearest&#xff09;AI图像放大算法&#xff08;4x-UltraSharp、BSRGAN、ESRGAN等&#xff09; 传统图像放大算法是基于插值算法&#xff0c;计算出图像放大后新位置的像素…

用友政务财务系统 FileDownload 任意文件读取漏洞复现

0x01 产品简介 用友政务财务系统具有多项核心功能,旨在满足各类组织的财务管理需求。首先,它提供了财务核算功能,能够全面管理企业的总账、固定资产、现金、应付应收等模块,实时掌握企业的财务状况,并通过科目管理、凭证处理、报表分析等功能为决策提供有力支持。 0x02 …

Elcomsoft iOS Forensics Toolkit: iPhone/iPad/iPod 设备取证工具包

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 Elcomsoft iOS Forensics Toolkit 软件工具包适用于取证工作&#xff0c;对 iPhone、iPad 和 iPod Touch 设备执行完整文件系统和逻辑数据采集。对设备文件系统制作镜像&#xff0c;提取设备机密&#xff08…

13.电子产品拆解分析-插排带3USB

13.电子产品拆解分析-插排带3USB 一、功能介绍二、电路分析以及器件作用1、三个插座之间通过电线连接,总开关控制火线2、通过FSD3773低待机功耗原边反馈AC/DC驱动芯片控制5V的输出一、功能介绍 ①一键控制总电源开关;②带三路USB输出;③最大支持2500W输出,10A输出电流;④8…