关于一个数据库查询的问题,最好cai用SQL搞定!(100分)

  • 主题发起人 主题发起人 wishme3
  • 开始时间 开始时间
W

wishme3

Unregistered / Unconfirmed
GUEST, unregistred user!
有个关于MSSQL的问题:
有两个表分别叫test1和test2
test1的字段为:标识ID(varchar),开始时间(datetime)
100001 1999-10-10 5:20:23
100002 1999-10-11 6:20:23
100001 1999-10-15 5:20:23
100002 1999-10-16 6:20:23

test2的字段为: 标识ID(varchar),结束时间(datetime)
100001 1999-10-12 5:20:23
100002 1999-10-13 6:20:23
100001 1999-10-16 5:20:23
100002 1999-10-17 6:20:23
我现在要实现的功能是计算各个标识的时间间隔(单位为分钟),要求是
100001 1999-10-10 5:20:23 对应的是test2的的:
100001 1999-10-12 5:20:23


100001 1999-10-15 5:20:23 对应的是test2的的:
100001 1999-10-16 5:20:23

也就是说一个标识的开始时间对应的结束时间是大于自身而小于下一个本
标识的开始时间

针对100001结果应该得到:
100001 2880
100001 1440

用SQL该如何实现?
 
为什么要分开成两个表呢?如果做成下面的结构就很好了,不知道你有什么理由要这样做:

标识ID(varchar) 开始时间(datetime) 结束时间(datetime)

 
两个表也很简单啊,只要知道计算时间差的公式就行了。
select abs(test1.datetime-test2.datetime)/60000 from test1,test2 where
test1.id=test2.id group by test1.id
 
好象用Sql语句不好实现,主要是“小于下一个本标识的开始时间”这个逻辑不好表达,我觉
的如果你没有特别的原因应做成BaKuBaKu所说的表结构。
 
可能需要用到临时表:
第一步:创建临时表:
Create Table #Temp(
标示ID char(6),
BeginTime DateTime,
EndTime DateTime
)
第二步:循环取值:
Declare @Count Int, @I Int,T1 DateTime,T2 DateTime,@ID char(6)
Select @Count=Count(ID) From Test1
Select @I=Count(ID) From Test2
if @Count<@I Select @Count=@I
Select @I=0,T1=0,T2=0,@ID=''
while @I<@Count
begin
Select @ID=ID,@T1=Min(开始时间) From Test1 Where ID>=@ID and 开始时间>T1
Select @T2=Min(结束时间) From Test2 Where ID=@ID and 结束时间>T2
Insert Into #Temp Values(@ID,@T1,@T2)
Set @I=@I+1
end
第三步:列表
Select * from #Temp
 
建临时表可以解决
 
同意楼上的各位
 
多人接受答案了。
 
后退
顶部