两个时间段比较的六种情况,以及交集、并集、补集简要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'
如上边的查询语句,可以得到四个时间,分别组成两个时间段,再进行后续个性化操作。
两个时间段比较的六种情况,以及交集、并集、补集简要sql语句示例的更多相关文章
- Oracle 两个逗号分割的字符串,获取交集、差集的sql实现过程解析
Oracle数据库的两个字段值为逗号分割的字符串,例如:字段A值为“1,2,3,5”,字段B为“2”.想获取两个字段的交集(相同值)2,获取两个字段的差集(差异值)1,3,5. 一.最终实现的sql语 ...
- [转载]INNER JOIN连接两个表、三个表、五个表的SQL语句
SQL INNER JOIN关键字表示在表中存在至少一个匹配时,INNER JOIN 关键字返回行. 1.连接两个数据表的用法: FROM Member INNER JOIN MemberSort O ...
- INNER JOIN连接两个表、三个表、五个表的SQL语句
1.连接两个数据表的用法: FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort 语法格式可以概括为 ...
- Oracle两个时间段是否重合、冲突
经常会碰到比较两个时间段是否冲突的情况. 思路1 最开始比较2个时间是否的思路是,时间段的重叠. 但是比较时间段重叠的情况,就有几种情况, 1. 时间前段冲突. 时间A: 2015-10-01 ...
- sql语句判断两个时间段是否有交集
场景: 数据库有有两个字段.开始时间<startTime>,和结束时间<endTime>,指定一个时间段(a,b),a表示开始时间,b表示结束时间.看数据库中有没有与(a,b ...
- Oracle判断两个时间段是否相交
SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2).我最先想到的是下面的方法一.方法一:(S1 BETWEEN S2 AND E2) OR (S2 BET ...
- jsp中文乱码六种情况---解决方案
转 jsp中文乱码六种情况---解决方案 2016年10月22日 21:32:55 阅读数:10672 来源:http://blog.csdn.net/lovesummerforever/articl ...
- PHP计算两个时间段是否有交集(边界重叠不算)
优化前的版本: /** * PHP计算两个时间段是否有交集(边界重叠不算) * * @param string $beginTime1 开始时间1 * @param string $endTime1 ...
- C#算两个时间段相差的时间
在数据中经常算两个时间差或者在某个时间段的内容 在数据库中设计表字段类型的时候设计为varchar类型,然后进行可以再Sql语句中书写>=或者<=这样的进行比较就可以查询出某个时间段的内容 ...
- mysql判断两个时间段是否有交集
//判断两个时间段是否有交集 private function checkTimeCross($start_time,$end_time){ $sql ) AND ((start_time > ...
随机推荐
- PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本
PEP 703的内容是什么,意义又是什么呢? 可以说python的官方接受的no-GIL提议的PEP就是PEP 703给出的,如果GIL帧的从python中移除那么可以说对整个python生态圈将有着 ...
- JAVA for Cplex(更新版)
一.Cplex的介绍 Cplex是一种专门用来求解大规模线性规划问题的求解工具.不仅仅是LP问题,对于二次规划 QP,二次有约束规划QCP,混合整数线性规划MIP问题,甚至Network Flow问题 ...
- Docker 容器中镜像导出/导入
目录 [容器]镜像导出/导入 导出 导入 带标签 不带标签,后期修改 [仓库]镜像导出/导入 导出 导入 导入(完整命令) 创建一个简单的Docker镜像 利用docker ps -a命令查看要导出的 ...
- 【工程应用十一】基于PatchMatch算法的图像修复研究(inpaint)。
这个东西是个非常古老的算法了,大概是2008年的东西,参考资料也有很多,不过基本上都是重复的.最近受一个朋友的需求,前后大概用了二十多天时间去研究,也有所成果,在这里简单的予以记录. 图像修 ...
- esphome-esp8266
esp8266使用esphome接入hass 对于生成配置文件的更改 此处nodemcu泛指集成的开发板,一般十几块钱一块 下方使用的是D1,对应的针脚是GPIO5 esp8266: board: n ...
- 使用 nuxi dev 启动 Nuxt 应用程序的详细指南
title: 使用 nuxi dev 启动 Nuxt 应用程序的详细指南 date: 2024/9/2 updated: 2024/9/2 author: cmdragon excerpt: 摘要:本 ...
- pycharm批量注释
pycharm批量注释不像是spyder可以鼠标右键选择,pycharm是要用快捷键的,选中要注释的代码,然后快捷键就可以了. 注释代码和取消注释代码的快捷键都一样ctrl + /
- 通用能力及AI核心能力表现优异!合合信息智能文档处理系统(IDP)高评级通过中国信通院评估
数字经济快速发展的背后,全球数据总量呈现出爆发式增长趋势.智能文档处理(IDP)技术能够高效地从多格式文档中捕捉.提取和处理数据,帮助机构和企业大幅提升文档处理效率,节约时间和人力成本.近期,合合信息 ...
- 系统编程-进程-exec系列函数超级详解(带各种实操代码)
我的相关博文: 系统编程-进程-close-on-exec机制 PART1 exec系列函数功能简介 exec系列函数登场 常规操作是先fork一个子进程,然后在子进程中调用exec系列函数执行新的 ...
- YAML编写应用的资源清单文件(十五)
上面我们在 Kubernetes 中部署了我们的第一个容器化应用,我们了解到要部署应用最重要的就是编写应用的资源清单文件.那么如何编写资源清单文件呢?日常使用的时候我们都是使用 YAML 文件来编写, ...