MySql对于时间段交集的处理和通用实现方式(MyBatis-Plus)

问题:一般传统时间筛选是在[ 开始时间 → 结束时间 ]这个区间内的子集,也就是全包含查询方式,这种只会筛选一种情况。如果场景需要是开展一个活动,需要活动时间检索应该但凡包含就返回,也就是需要查询这个时间段有涉及的都需要筛选出来,即返回产生交集的数据

1.数据分析

上图是4 - 5月份中开展活动7种时间段,如果以V1的启止时间作为筛选条件,会遇到6种情况

V2:数据位于查询左侧,不产生交集

        V2结束时间 ≥ V1开始时间

V3:数据交集查询左侧区域,产生交集

        V1开始时间 ≤ V3结束时间 ≤ V1结束时间,

V4:数据位于查询的子集内,产生交集

        V4结束时间 ≥ V1结束时间,V4开始时间 ≤ V1开始时间

V5:数据交集查询右侧区域,产生交集

        V1开始时间 ≤ V5开始时间 ≤ V1结束时间

V6:数据位于查询右侧,不产生交集

        V1结束时间 ≤ V6开始时间

V7:数据的部分子集数据位于查询全集区域,产生交集

        V7开始时间 ≥ V1开始时间,V1结束时间 ≤ V7结束时间,

        这 6 种情况,产生交集的只有 4 种,也就是需要把这4种情况的时间段筛选出来,可以归纳为三类场景

查询时间以 [ startTime, endTime ] 作为筛选条件,开始时间和结束时间为某一个时间段的代称

  1. 全部包含(子集)和左边包含(V3、V4)startTime ≥ 结束时间  ≥ endTime
  2. 右边包含 (V5)startTime ≥ 开始时间  ≥ endTime
  3. 全部包含(被子集)(V7)开始时间 ≥ startTime,endTime  ≥ 结束时间

2.MySql查询尝试

创建一个活动表,补充活动开始时间和结束时间,并填充6种情况数据数据

CREATE TABLE `activity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `activity_start_time` datetime DEFAULT NULL COMMENT '活动开始时间',
  `activity_end_time` datetime DEFAULT NULL COMMENT '活动结束时间',
  PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 0 DEFAULT CHARSET = utf8 COMMENT = '活动';

我们需要查询的时间段是 [ "2022-04-28 00:00:00" , "2022-05-04 00:00:00" ] 涉及的数据

SELECT * from activity where
# 全部包含(子集)和左边包含
("2022-04-28 00:00:00" <=activity_end_time and activity_end_time <="2022-05-04 00:00:00")
# 右边包含
or ("2022-04-28 00:00:00"<=activity_start_time and activity_start_time <="2022-05-04 00:00:00")
# 全部包含(被子集)
or (activity_start_time <= "2022-04-28 00:00:00" and "2022-05-04 00:00:00" <= activity_end_time)

3.通用方法

Mysql通用模板

SELECT * from activity where
# 全部包含(子集)和左边包含
("开始时间" <=activity_end_time and activity_end_time <="结束时间")
# 右边包含
or ("开始时间"<=activity_start_time and activity_start_time <="结束时间")
# 全部包含(被子集)
or (activity_start_time <= "开始时间" and "结束时间" <= activity_end_time)

 MyBatis-plus通用功能

    /**
     * 时间交集,与当前时间有交集筛选
     *
     * @param beginColumn 指定开始列
     * @param endColumn   指定结束列
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @param <T>         类型
     * @param <R>         列类型
     * @return
     */
    public <T, R> Consumer<LambdaQueryWrapper<T>> timeIntersection(
            SFunction<T, R> beginColumn, SFunction<T, R> endColumn, Date startTime, Date endTime) {
        return wrapper -> {
            //全部包含(子集)和左边包含
            wrapper.and(x -> x.ge(endColumn, startTime).le(endColumn, endTime))
                    //右边包含
                    .or(x -> x.ge(beginColumn, startTime).le(beginColumn, endTime))
                    //全部包含(被子集)
                    .or(x -> x.le(beginColumn, startTime).ge(endColumn, endTime));
        };
    }

使用方式

 
    @Test
    public void testTime() throws Exception{
        //数据准备
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startTime =sdf.parse("2022-04-28 00:00:00");
        Date endTime =sdf.parse("2022-05-04 00:00:00");
 
        //使用方式
        LambdaQueryWrapper<Activity> queryWrapper = new LambdaQueryWrapper<Activity>()
                .func(startTime != null && endTime != null, timeIntersection(
                        Activity::getActivityStartTime, Activity::getActivityEndTime, startTime, startTime));
    }
 
    /**
     * 时间交集,与当前时间有交合条件
     *
     * @param beginColumn 指定开始列
     * @param endColumn   指定结束列
     * @param beginTime   开始时间
     * @param endTime     结束时间
     * @param <T>         类型
     * @param <R>         列类型
     * @return
     */
    public static  <T, R> Consumer<LambdaQueryWrapper<T>> timeIntersection(
            SFunction<T, R> beginColumn, SFunction<T, R> endColumn, Date beginTime, Date endTime) {
        return wrapper -> {
            //全部包含(子集)和左边包含
            wrapper.and(x -> x.ge(endColumn, beginTime).le(endColumn, endTime))
                    //右边包含
                    .or(x -> x.ge(beginColumn, beginTime).le(beginColumn, endTime))
                    //全部包含(被子集)
                    .or(x -> x.le(beginColumn, beginTime).ge(endColumn, endTime));
        };
    }
 
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Activity{
        /** 主键 */
        private Long id;
        /** 开始时间 */
        private Date activityStartTime;
        /** 结束时间 */
        private Date activityEndTime;
    }

 

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

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

相关文章

大sql mysql执行

先把sql 拆分 太大的执行失败 使用 SQLDumpSplitter3 拆分sql 执行拆分的sql 拆分的sql 打开发现很多 ; 开头的空行 替换掉 正则 ^; 修改数据库 my.cnf my,ini 执行可能会提示 [ERR] 2006 - Server has gone away 错误 在 [mysqld] 添加以下几行 wait_timeout2880000 inter…

【机器学习】《ChatGPT速通手册》笔记

文章目录 第0章 前言第1章 ChatGPT的由来&#xff08;一&#xff09;自然语言处理任务&#xff08;二&#xff09;ChatGPT所用数据数据大小&#xff08;三&#xff09;ChatGPT的神经网络模型有175亿个参数&#xff08;四&#xff09;模型压缩 方案 第2章 ChatGPT页面功能介绍&a…

Flutter MQTT通信(实现聊天功能)

MQTT协议简介&#xff1a; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、开放的、基于发布/订阅模式的消息传输协议&#xff0c;最初由IBM开发。它专门设计用于在低带宽、不稳定的网络环境下进行高效的消息传输。 学习完本篇文章&#x…

探索通过GPT和云平台搭建网安实战培训环境

项目背景 网络安全是一个不断演变的领域&#xff0c;面临着日益复杂的挑战和不断扩大的威胁。数字化时代&#xff0c;随着勒索攻击、数据窃取、网络钓鱼等频频出现&#xff0c;网络攻击的威胁指数和影响范围进一步增加&#xff0c;如何防范网络攻击&#xff0c;确保数据安全&a…

网络初识

网络 局域网 一个区域的网 广域网 相对概念&#xff0c;没有绝对的界限&#xff0c;全世界现在最大的广域网&#xff0c;就教做TheInternet&#xff0c;万维网 路由器 交换机和路由器&#xff0c;都是用来组建网络的重要设备 交换机 上网的设备&#xff08;电脑/手…

Jupyter Notebook更改默认打开的浏览器和工作目录

Jupyter Notebook更改工作目录 打开cmd&#xff0c;输入&#xff1a;jupyter notebook --generate-config&#xff0c;可以得到Jupyter Notebook配置文件的路径&#xff0c;找到路径下的jupyter_notebook_config.py文件&#xff0c;用记事本或者Sublime打开文件 找到&#xff…

Linux下:gcc/g++调试工具gdb

gdb 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 gdb mybin debug和release debug debug模式下生成的可执行程序会添加调试信息&#xff0c;所以生成的可执行程序会较大 在使用gcc/g进行编译的时…

日期类的实现

目录 Date.h Test.cpp 测试代码Test.cpp 日期类的实现 代码分享 Date.h #pragma once #include<iostream> using namespace std; #include<assert.h>class Date {//友元函数声明friend ostream& operator<<(ostream& out, Date& d);friend…

LWIP开发之静态IP为什么接收和发送不了数据

使用的硬件开发板是探索者F4 V3版本 这里用的LWIP的lwIP例程7 lwIP_NETCONN_UDP实验 问了开发板的官方和其他人都说不清楚&#xff1b;搞了两天&#xff0c;浪费了两天时间&#xff1b; 最奇葩的问题还在于只能单片机发送&#xff0c;上位机能接收。而上位机发送单片机不能接…

国产信创办公软件(流版式软件)厂家汇总以及国产信创外设汇总

国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总以及国产信创外设汇总。 国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总 在信创背景下&#xff0c;国内流版式软件的发展呈现出蓬勃的态势。信创&#xff0c;即信息技术应用创新产业&#xff0c;旨在…

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version #检查是否已经安装mysql systemct…

List的介绍

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录 1-引言&#xff1a;什么是慢查询1-1 慢查询定义1-2 为什么排查慢查询 2-核心&#xff1a;慢查询排查2-1 慢查询定位2-2 慢查询解决2-2-1 Explain 排查慢查询2-2-2 Explain 重点关键字 3-总结&#xff1a;慢查询知识点小结 1-引言&#xff1a;什么是慢查询 1-1 慢查询定义…

配置静态路由实现全网互通

1、实验环境 如图下所示&#xff0c;三台路由器R1&#xff0e;R2&#xff0c;R3两两互连&#xff0c;每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由&#xff0c;以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

kaggle 泰坦尼克使用xgboost 得分0.73684

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

Hive基础5

一、窗口函数 聚合&#xff0c;取值函数 排序函数 over(partition by 分组字段 order by 字段 row between 起始行 and 结束行) /*创建部门表*/ CREATE TABLE dept (deptno INT PRIMARY KEY,dname VARCHAR(50) comment 部门名称,loc VARCHAR(50) comment 工作地点 ); ​ /*…

2024团体程序设计天梯赛L1-101 别再来这么多猫娘了!

题目链接L1-101 别再来这么多猫娘了&#xff01; #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; string s[105], text; int n, k, ans, a[5005];int main() { // ios::s…

【项目】基于JDBC+MySQL的Java教务管理系统(附源码+论文说明)

摘要 随着信息技术的不断发展&#xff0c;教育管理也在向数字化、智能化方向迈进。Java作为一种广泛应用于企业级应用开发的编程语言&#xff0c;与数据库技术的结合更是为教务管理系统的开发提供了强大的支持。 本文将介绍基于JDBC&#xff08;Java Database Connectivity&a…

短视频不够500有效粉丝怎么涨?如何涨有效粉丝?巨量千川投流怎么涨粉的?

近期&#xff0c;一些使用抖音橱窗功能的用户遇到了一个问题&#xff0c;他们在挂橱窗时会出现“有效粉丝不足500”无法正常挂橱窗的提示。这个问题是由于抖音平台改变了规则所致。现在&#xff0c;只有通过观看视频而非刷关注的粉丝才被算作有效粉丝&#xff0c;其他的粉丝都将…

39. UE5 RPG角色释放技能时转向目标方向

在上一篇&#xff0c;我们实现了火球术可以向目标方向发射&#xff0c;并且还可以按住Shift选择方向进行攻击。技能的问题解决&#xff0c;现在人物释放技能时&#xff0c;无法朝向目标方向&#xff0c;接下来我们解决人物的问题。 实现思路&#xff1a; 我们将使用一个官方的…