两个时间段比较的六种情况,以及交集、并集、补集简要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'

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

相关推荐
睿途低空新程14 小时前
面向城市治理的AI集群空域融合模型
人工智能·经验分享·其他·无人机
努力的搬砖人.1 天前
中国科学院大学计算机考研历年初试分数线分析以及计算机所考的科目有哪些?
其他
橙子家2 天前
GitLab CI/CD 的配置文件 .gitlab-ci.yml 简介
其他
老陈头聊SEO4 天前
SEO长尾词优化实战布局
其他
ye150127774555 天前
220V转直流非隔离传感器供电电源芯片WT5105
stm32·单片机·嵌入式硬件·其他·硬件工程
时空无限6 天前
虚无隧穿产生宇宙(true nothing tunneling) 是谁提出的
其他
张高兴8 天前
为什么要对程序进行调试
其他
这是我588 天前
awk命令——功能强大的文本处理工具
linux·其他·shell·awk·强大··
cwtlw11 天前
PhotoShop学习10
笔记·学习·其他·photoshop
stockmasterx11 天前
什么是ETF跟踪误差?场内基金佣金最低是多少?
经验分享·笔记·其他