主键:姓名+类别+起始日期姓名 类别 起始日期 终止日期 说明
赵 A 2002.4.1 2004.4.1 赵在这个区间属于A类人员
赵 B 2004.4.1 2006.4.1 赵在这个区间属于B类人员
赵 A 2008.6.1 2008.4.1 赵在这个区间再次属于A类人员
以上都是正确的。但是由于维护问题,出现交叉情况:
赵 B 2003.5.1 2006.5.1 赵在这个区间被属于C类人员如何把日期交叉的记录查出来?或把日期交叉的人员查出来即可?
赵 A 2002.4.1 2004.4.1 赵在这个区间属于A类人员
赵 B 2004.4.1 2006.4.1 赵在这个区间属于B类人员
赵 A 2008.6.1 2008.4.1 赵在这个区间再次属于A类人员
以上都是正确的。但是由于维护问题,出现交叉情况:
赵 B 2003.5.1 2006.5.1 赵在这个区间被属于C类人员如何把日期交叉的记录查出来?或把日期交叉的人员查出来即可?
解决方案 »
- 用VB+SQL SERVER 2000+ADO练习编写网络版软件,那么在同一台电脑上如何模拟出3个客户端?
- 【请教】sql server2000,存入varchar(1000)类型数据,只得到1个“?”
- 四层结构自连接问题?
- SQL数据库被置疑,处理后数据库连接失败,求救!
- 关于SQL Server2005数据库同步问题,头疼好几天了,希望高手指导指导
- 求助,游标出错
- 难题无法解决,寻求高手帮帮我,再线等.......
- 关于光标的问题!救命啊!
- 请问“结构化查询语言”中的结构化是什么意思,最好打个比方,谢谢!
- oracel高手请进
- 怎样把这样的一个表拆分成两个表?
- 两表进行连接时,系统的执行过程是怎样的?
呵呵,不好意思,我理解错误。
其实数据库中是以代码保存的,为了方便,我这里写的是名字。
代码是不会重复的。to wgzaaa:
你的语句道理好像不行啊。
如果我以数字(int)举例
User1 1-2(1,2)
User2 1-4(1,2,3,4)
User3 3-4(3,4)User1,User2有重复,
User2,User3有重复
但User1,User3没有重复你想要的是什么样的结果
赵 A 2008.6.1 2008.4.1 赵在这个区间再次属于A类人员这个明显第一个日期要比第二个日期大 where (起始日期 > 终止日期) 这样可以不?
select * from tb a,
(select * from tb)b
where a.name=b.name
and a.id=b.id-1
and a.time_end>b.time_begin
order by name,time_begin如果不增加自增字段
select * from tb a,
(select * from tb)b
where a.name=b.name
and b.time_begin>a.time_begin
and b.time_begin=(select min(time_begin) from tb where time_begin>a.time_begin)
and a.time_end>b.time_begin
order by name,time_begin 思路:相邻的两条记录,如果前一条的结束时间大于后一条记录开始时间,则显示这条记录
加一个条件把自身排除就行了。
看来没有主键的表是不好用的,需要加一个id字段才行。select 1 id,'赵' 姓名,'A' 类别,'2002.4.1' 起始日期,'2004.3.31' 终止日期 into 表
union select 2,'赵','B','2004.4.1','2006.5.31'
union select 3,'赵','A','2008.6.1','2008.9.2'
union select 4,'赵','B','2003.4.1','2004.1.2'select * from 表--有交叉的记录
select * from 表 A
where exists (
select 1 from 表
where 姓名=A.姓名
and id<>A.id
and (起始日期 between A.起始日期 and A.终止日期
or 终止日期 between A.起始日期 and A.终止日期)
)
--交叉的记录
select * from 表 A where exists (select 1 from 表 where A.姓名=姓名 and (A.起始日期 between 起始日期 and 终止日期 or A.终止日期 between 起始日期 and 终止日期) and A.id<>id)--这个就是wgzaaa() 那个加了个条件
drop table 表
这个问题可以用开、闭区间区分啊。
如:(起始日期,终止日期],表示:起始日期 < date <= 终止日期。