首页 新闻 会员 周边 捐助

sql语句比较两表日期是否有重叠

0
悬赏园豆:40 [待解决问题]

create table #t1 (name nvarchar(50),age int,sex nvarchar(50),ruxuedate datetime,tuixuedate datetime);

insert into #t1
select '张三',11,'男','2014-01-29','2014-02-15'
union all
select '李四',12,'女','2014-02-15','2014-03-18'
union all
select '王五',13,'女','2014-03-01','2014-03-05';
go

create table #t2 (name nvarchar(50),age int,sex nvarchar(50),ruxuedate datetime,tuixuedate datetime);

insert into #t2
select '张三',11,'男','2014-01-30','2014-02-13'
union all
select '李四',12,'女','2014-3-18','2014-03-20'
union all
select '王五',13,'女','2014-03-06','2014-03-15';
go

t1

姓名 年龄 性别 入学日期 毕业日期
张三 11
2014-01-29
2014-02-15
李四 12
2014-02-15
2014-03-18
王五 13 2014-03-01 2014-03-05

t2

姓名 年龄 性别 入学日期 毕业日期
张三 11
2014-01-30
2014-02-13
李四 12
2014-3-18
2014-03-20
王五 13 2014-03-06 2014-03-15

想显示结果如下,判断条件(t2.入学日期<=t1.毕业日期 && t2.毕业日期>=t1.入学日期 就算重叠):

张三,11,男 日期有重叠

李四,12,女 日期有重叠

请问大家用sql如何实现?谢谢~~

冬天我愛吃火鍋的主页 冬天我愛吃火鍋 | 初学一级 | 园豆:180
提问于:2016-08-26 14:52
< >
分享
所有回答(2)
0

思路反一下,不重叠的是什么情况?比如A跟B,不重叠就是A的开始时间比B的结束时间还大,或者反过来B的开始时间比A的结束时间还大,当然,首先要确定,每个人的结束时间都在开始时间之后。。。

顾晓北 | 园豆:10898 (专家六级) | 2016-08-26 14:59

是的呢,王五的情况就是不重叠的

支持(0) 反对(0) 冬天我愛吃火鍋 | 园豆:180 (初学一级) | 2016-08-26 15:02

咦 , 又是你啊 ,朋友, 这个问题能帮解决下吗 (*^__^*) 

支持(0) 反对(0) 冬天我愛吃火鍋 | 园豆:180 (初学一级) | 2016-08-26 15:03

@宋小熊: 你数据都列出来了,还不简单吗???

select t1.姓名,t1.年龄,t1.性别  from t2 join t1 on t2.姓名=t1.姓名

where not (t1.开始时间>t2.结束时间) or (t2.开始时间>t1.结束时间)

如果想把“是否有重叠”这一列加进去,就用case when搞定就行了。。。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2016-08-26 15:09

@顾晓北: 

帮忙看下是这样吗 ? 

select #t1.name,#t1.age,#t1.sex,case when #t2.ruxuedate<=#t1.tuixuedate and #t1.tuixuedate>=#t2.ruxuedate then '重叠'
else '不重叠' end
from #t2 join #t1 on #t2.name=#t1.name
and #t2.age=#t1.age
and #t2.sex=#t1.sex
where not (#t1.ruxuedate>#t2.tuixuedate) or (#t2.ruxuedate>#t1.tuixuedate)

支持(0) 反对(0) 冬天我愛吃火鍋 | 园豆:180 (初学一级) | 2016-08-26 15:22

@宋小熊: 我语句都给你写出来了,你自己理解吧,只能帮你到这儿了。。。

再说了,是不是,你自己试一下就行了嘛。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2016-08-26 15:26

@顾晓北: 不太明白为什么 要加where not 

如果用case when 的话直接就可以判断, 为什么还要加where not 

支持(0) 反对(0) 冬天我愛吃火鍋 | 园豆:180 (初学一级) | 2016-08-26 15:30

@宋小熊: 。。。不加where not就是查询所有,刚开始我还以为你只筛选出重叠的,后来看到你是要查出所有,新增一列,就case when就行。。。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2016-08-26 15:38
0
--,判断条件(t2.入学日期<=t1.毕业日期 && t2.毕业日期>=t1.入学日期 就算重叠):
select t1.name,
    t1.age,
    t1.sex,
    case when t2.ruxuedate<=t1.tuixuedate and t2.tuixuedate>=t1.ruxuedate
        then N'有重叠'
        else N'无重叠'
    end as IsOverlap
from #t1 as t1 
inner join #t2 t2 
    on t1.name=t2.name and t1.age=t2.age and t1.sex=t2.sex

 

 

悦光阴 | 园豆:2251 (老鸟四级) | 2016-08-26 16:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册