两个时间段比较的六种情况,以及交集、并集、补集简要sql语句示例

〇、两时间段比较的全部情况

总共有如下图中的六种情况:

下文将根据这六种情况进一步操作。

注意,图中说的动态和固定两时间段,就是两个普通时间段,不区分主次,仅用作帮助理解。

一、判断两个时间段是否有交叉(交集)

正常情况下,就是图中的 2、3、4、5 四种有交叉的情况。如果直接通过这四种情况判断的话,就需要四个判断条件组合,过于复杂,本文略过。

如果通过逆向思维的话,就只需要判断 1、6 两种情况。当然推荐使用逆向思维,判断的情况比较少,也易于理解,下边详细介绍下。

判断两时间段不交叉的条件

-- 动态结束时间 < 固定开始时间
jieshusj_dt < kaishisj_gd -- 情况 1
or
kaishisj_dt > jieshusj_gd -- 情况 6
-- 动态开始时间 > 固定结束时间

那么,就可以通过取反,得到两时间段有交叉的条件

-- 动态结束时间 >= 固定开始时间
jieshusj_dt >= kaishisj_gd
and
kaishisj_dt <= jieshusj_gd
-- 动态开始时间 <= 固定结束时间

二、取两个时间段的交叉部分(交集)

前提条件:通过了有交叉判断。也就是包含 2、3、4、5 四种情况。

然后,就需要分别比较两个时间段的开始时间和结束时间:

  • 开始时间:取较大的那一个;
  • 结束时间:取较小的那一个。
-- 动态时间段示例:2024-10-16 ~ 2024-10-20
select 
-- 开始时间取较大的
(Case When kaishisj_gd > '2024-10-16' Then kaishisj_gd Else '2024-10-16' End) kaishisj,
-- 结束时间取较小的
(Case When jieshusj_gd < '2024-10-20' Then jieshusj_gd Else '2024-10-20' End) jieshusj
from table_name

三、取两个时间段并集

取并集也需要分两种情况,就是是否有交叉。

  • 第一种:无交叉

直接将两个时间段进行‘或’运算即可。

  • 第二种:有交叉

此种情况也是分别比较两个时间段的开始时间和结束时间,但是取值和上一章节中刚好相反,:

  • 开始时间:取较小的那一个;
  • 结束时间:取较大的那一个。
-- 动态时间段示例:2024-10-16 ~ 2024-10-20
select 
-- 开始时间取较小的
(Case When kaishisj_gd > '2024-10-16' Then '2024-10-16' Else kaishisj_gd End) kaishisj,
-- 结束时间取较大的
(Case When jieshusj_gd < '2024-10-20' Then '2024-10-20' Else jieshusj_gd End) jieshusj
from table_name

四、取两个时间段的补集

首先,什么是补集?简单的示意图如下:

(其中,全集‘集合 B’包含‘集合 A’,那么图中灰色部分就是‘集合 A’的补集

所以,求补集的前提条件就是两个时间段的有包含关系,也就是情况 3、4。

  • 情况 3:

-- 动态时间段示例:2024-10-16 ~ 2024-10-20
select 
kaishisj_gd,'2024-10-16' as jieshusj_new, -- 两个时间,组成新的时间段
'2024-10-20' as kaishisj_new,jieshusj_gd  -- 两个时间,组成新的时间段
from table_name 
where kaishisj_gd < '2024-10-16' and jieshusj_gd > '2024-10-20'

如上边的查询语句,可以得到四个时间,分别组成两个时间段,再进行后续个性化操作。

  • 情况 4:

-- 动态时间段示例:2024-10-16 ~ 2024-10-20
select 
'2024-10-16' as kaishisj_new, kaishisj_gd, -- 两个时间,组成新的时间段
jieshusj_gd, '2024-10-20' as jiehsusj_new  -- 两个时间,组成新的时间段
from table_name 
where kaishisj_gd > '2024-10-16' and jieshusj_gd < '2024-10-20'

如上边的查询语句,可以得到四个时间,分别组成两个时间段,再进行后续个性化操作。

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

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

相关文章

服务器端渲染和客户端渲染(前后端分离)

前后端分离的优势 ◼ 早期的网页都是通过后端渲染来完成的:服务器端渲染(SSR,server side render):客户端发出请求-> 服务端接收请求并返回相应HTML文档-> 页面刷新,客户端加载新的HTML文档; ◼ 服务器端渲染的缺点:当用户点击页面中的某个按钮向服务器发送请…

建模规范:建立优质模型的关键

前言建模规范为开发高质量且符合标准的软件铺平道路。使用Simulink建模是实现和可视化功能的好方法,同时还能从中生成代码。模型质量对生成代码的质量有重大影响。从模型层面来说,面临的挑战是如何处理大量可能的建模元素,它们的扩展配置,以及交互。这给软件工作带来了困难…

学浪抖音课堂视频课程下载工具,如何在电脑端下载学浪抖音课堂视频课程课件资料到本地?

一. 安装学浪抖音课堂课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/xuelang_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学…

KBPC1010-ASEMI新能源专用方桥KBPC1010

KBPC1010-ASEMI新能源专用方桥KBPC1010编辑:ll KBPC1010-ASEMI新能源专用方桥KBPC1010 型号:KBPC1010 品牌:ASEMI 封装:KBPC-4 安装方式:直插 批号:2024+ 现货:50000+ 正向电流(Id):10A 反向耐压(VRRM):1000V 正向浪涌电流:200A 正向电压(VF):1.10V 引脚数量:…

请问PbootCMS为什么需要授权码?

为什么需要授权码?合法性验证:确保系统使用的合法性,防止非法使用。 技术支持:官方可以通过授权码提供更好的技术支持和服务。 统计使用情况:帮助官方统计系统使用情况,以便不断改进和优化。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精…

URP

简介 URP是Unity的高性能渲染管线,用于提高渲染效率和定制化。优化了手机游戏的性能,通过限制条件实现平衡效果与性能。URP包含渲染器、SRP、RenderPass、ShaderGraph和PostProcessing等组件,允许开发者自定义渲染流程。通过GeometryPass和ForwardPass等渲染通道,以及烘培光…

法线贴图

法线贴图 在三维计算机图形学中,法线贴图(英语:Normal mapping)是一种模拟凹凸处光照效果的技术,是凸凹贴图的一种实现。法线贴图可以在不添加多边形的前提下,为模型添加细节。常见的使用场景是为低多边形模型改善外观、添加细节,此时的法线贴图一般根据高多边形模型或高…

有道精品课视频课件课程下载工具,如何在电脑端下载有道精品课视频课程课件资料到本地?

一. 安装有道精品课课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/youdao_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无…

销冠教你如何转化观望客户

在销售实践中,常会遇到这样的场景:客户对我们的提案表现出极大的兴趣,但在执行阶段却显得迟疑,频繁表示“还需观望,再考虑”。这种态度不仅拖慢了项目进度,甚至可能导致项目完全停滞,从而错失宝贵的发展机遇。面对这一挑战,销售人员该如何有效应对?以下是一则来自销售…

Re:从零开始的pwn学习(栈溢出篇)

ctf栈溢出pwn题入门写在前面:本文旨在帮助刚接触pwn题的小伙伴少走一些弯路,快速上手pwn题,内容较为基础,大佬轻喷。本文默认读者明白最基础的汇编指令的含义,并且已经配置好linux64位环境,明白基础的Linux指令。 栈,栈帧与函数调用 我们知道,在数据结构中,栈是一种先…

ssts-hospital-web-master项目实战记录二:版本管理-git

记录时间:2024-10-23 1.VSCode打开项目 (1)文件→打开文件夹,对应的英文为File→Open Folder(2)打开效果如下 2.VSCode本地项目托管(1)打开终端:Terminal→New Terminal(2)生成仓库:git init 输入 git命令 git init (3)添加到暂存区:git add . 输入 git命令 gi…