sqlserver 各种集合、区间、 时间轴(持更)

1.所有有交集的区间

场景:在事件表里查找某年员工的岗位系数,并计算其加权平均数。case1:该员工是老员工,从2020年一直到2049年。case2:该员工是老员工,但是今年离职。case3:该员工是今年的新员工,今年入职,今年离职。case4:该员工是今年的新员工,一直在职。case5:该员工是今年的新员工,未来离职。

sql 复制代码
select * from A where datediff(MINUTE,FromDate,CONVERT(CHAR(5),{TERM},120)+'12-31')>0 and datediff(MINUTE ,CONVERT(CHAR(5),{TERM},120)+'01-01' ,ToDate )>0 

2.部分有交集

场景:

sql 复制代码
 select * from  A where ((datediff(MINUTE,@begintime,endtime)>0  and datediff(MINUTE ,BeginTime ,@BeginTime )>0)
				or (  datediff(MINUTE,@EndTime ,endtime)>0  and datediff(MINUTE ,BeginTime ,@EndTime )>0 ))

3.只有子集

场景:

sql 复制代码
select * from A where @BeginTime>BeginTime And EndTime>@EndTime

4.没交集

场景:

sql 复制代码
select * from A Where @BeginTime>a.EndTime
			Or BeginTime>@EndTime

5.取交集外的部分

场景

sql 复制代码
	Select 
		Case When b.BeginTime Between a.BeginTime And a.EndTime And b.EndTime>=a.EndTime Then a.BeginTime Else b.EndTime End
		,Case When a.BeginTime Between b.BeginTime And b.EndTime And a.EndTime>=b.EndTime Then a.EndTime Else b.BeginTime End
from A a,B b		
	Where (a.BeginTime<>b.BeginTime Or a.EndTime<>b.EndTime)
		And ((b.BeginTime Between a.BeginTime And a.EndTime And b.EndTime>=a.EndTime)
			Or (a.BeginTime Between b.BeginTime And b.EndTime And a.EndTime>=b.EndTime))
		And Case When b.BeginTime Between a.BeginTime And a.EndTime And (b.EndTime>=a.EndTime) Then a.BeginTime Else b.EndTime End
			<Case When a.BeginTime Between b.BeginTime And b.EndTime And (a.EndTime>=b.EndTime) Then a.EndTime Else b.BeginTime End

6.取交集部分

场景

sql 复制代码
	Select Case When b.BeginTime Between a.BeginTime And a.EndTime And b.EndTime>=a.EndTime Then b.begintime Else a.begintime End
	,Case When a.BeginTime Between b.BeginTime And b.EndTime And a.EndTime>=b.EndTime Then a.endtime Else b.endtime End
From A a,B b
Where (a.BeginTime<>b.BeginTime Or a.EndTime<>b.EndTime)
	And ((b.BeginTime Between a.BeginTime And a.EndTime And b.EndTime>=a.EndTime)
		Or (a.BeginTime Between b.BeginTime And b.EndTime And a.EndTime>=b.EndTime))
	And Case When b.BeginTime Between a.BeginTime And a.EndTime And (b.EndTime>=a.EndTime) Then a.BeginTime Else b.EndTime End
		<Case When a.BeginTime Between b.BeginTime And b.EndTime And (a.EndTime>=b.EndTime) Then a.EndTime Else b.BeginTime End

7.一般的取交集(左端都要取最大,右端取最小)

场景:

复制代码
Select 
	Case When BeginDate<@BeginDate Then @BeginDate Else BeginDate End,		
	Case When EndDate>@EndDate Then @EndDate Else EndDate End
相关推荐
聚美智数4 分钟前
车辆合格证OCR识别-机动车合格证识别-车辆合格证OCR‑机动车出厂证解析‑整车参数提取 API 接口介绍
数据库·经验分享
DBA_G8 分钟前
南大通用技术分享:GBase 8a数据库执行计划架构原理解析
数据库
QQ_216962909615 分钟前
基于SpringBoot+Vue的小生活平台的设计与实现
java·数据库·vue.js·spring boot·spring·微信小程序·生活
考虑考虑8 小时前
数据库中的EXISTS
运维·数据库·后端
Wang's Blog8 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
梦想平凡10 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
xcLeigh10 小时前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
yume_sibai11 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
AugustRed12 小时前
Neo4j 图数据库原理 + 应用场景简单介绍
数据库·neo4j
Gl�ria12 小时前
Redis 高可用架构对比
数据库·redis