+ -
当前位置:首页 → 问答吧 → sql 相邻记录的不同字段(字段类型为DataTime)相比较

sql 相邻记录的不同字段(字段类型为DataTime)相比较

时间:2011-12-08

来源:互联网

一个A表数据如下:

单号 送修时间     维修完成时间
1 2011-10-9       2011-10-28
2 2011-10-25     2011-10-31
3 2011-11-16     2011-12-30

第二行的送修时间与第一行的维修完成时间的差,小于或者等于30,就把这条记录显示出来

效果如图:

单号 送修时间     维修完成时间
1 2011-10-9       2011-10-28
2 2011-10-25     2011-10-31

请教各位大虾指教指教,用sql怎样写才能得到效果图的数据??

作者: so_fantasy   发布时间: 2011-12-08

SQL code
select * from tb where datediff(d,送修时间,维修完成时间)<=30

作者: qianjin036a   发布时间: 2011-12-08

SQL code
select * from tb where datediff(day,送修时间,维修完成时间)<=30

作者: ssp2009   发布时间: 2011-12-08

是第二行的送修时间-第一行的维修完成时间

select * from tb where datediff(day,送修时间,维修完成时间)<=30
应该是同一行的送修时间与维修完成时间比较吧

作者: so_fantasy   发布时间: 2011-12-08

不好意思!表的数据写错了!!

作者: so_fantasy   发布时间: 2011-12-08

引用 3 楼 so_fantasy 的回复:

是第二行的送修时间-第一行的维修完成时间

select * from tb where datediff(day,送修时间,维修完成时间)<=30
应该是同一行的送修时间与维修完成时间比较吧


这样处理,就是同一行天数的差减.

作者: qianjin036a   发布时间: 2011-12-08

A表数据应该是:

单号 送修时间 维修完成时间 
1 2011-10-9 2011-10-10 
2 2011-10-15 2011-10-31 
3 2011-12-16 2011-12-30 

效果如下:
单号 送修时间 维修完成时间 
1 2011-10-9 2011-10-10 
2 2011-10-15 2011-10-31

作者: so_fantasy   发布时间: 2011-12-08

SQL code
--那:如果ID连续的话:
select b.单号,a.送修时间,b.维修完成时间 
from tb a inner join tb b on a.单号=b.单号+1
where datediff(d,a.送修时间,b.维修完成时间)<=30

如果单号不连续的话,要用row_number()函数创建一个连续的编号,代替上面的单号.

作者: qianjin036a   发布时间: 2011-12-08

这样啊!
SQL code
select a.* 
from tb a inner join tb b on a.单号=b.单号-1
where datediff(d,a.维修完成时间,b.送修时间)<=30

作者: qianjin036a   发布时间: 2011-12-08

SQL code

create table A表(单号 int, 送修时间 date,维修完成时间 date)

insert into A表
select 1, '2011-10-9', '2011-10-10' union all  
select 2, '2011-10-15', '2011-10-31' union all    
select 3, '2011-12-16', '2011-12-30'


select a.*
from A表 a
left join A表 b on a.单号-1=b.单号
where b.单号 is null or
datediff(dd,b.维修完成时间,a.送修时间)<=30

单号          送修时间       维修完成时间
----------- ---------- ----------
1           2011-10-09   2011-10-10
2           2011-10-15   2011-10-31

(2 row(s) affected)

作者: ap0405140   发布时间: 2011-12-08

第二行的送修时间与第一行的维修完成时间的差,小于或者等于30,就把这条记录显示出来 


那你表中的第二行就不会显示了.因为它与第三行天数差已经大于30了!

作者: qianjin036a   发布时间: 2011-12-08

引用 7 楼 qianjin036a 的回复:

SQL code
--那:如果ID连续的话:
select b.单号,a.送修时间,b.维修完成时间
from tb a inner join tb b on a.单号=b.单号+1
where datediff(d,a.送修时间,b.维修完成时间)<=30

如果单号不连续的话,要用row_number()函数创建一个连续的编号,代替上面的单号.


这个方法可行喔!
那我还有个难点就是:

A表数据如下:

单号 条码 送修时间 维修完成时间  
1 A 2011-10-9 2011-10-10  
2 A 2011-10-15 2011-10-31  
3 A 2011-12-16 2011-12-30 
4 B 2011-9-10 2011-9-15
5 B 2011-11-10 2011-11-20
6 C 2011-12-1 2011-12-3
7 C 2011-12-5 2011-12-6

效果如下:

单号 条码 送修时间 维修完成时间  
1 A 2011-10-9 2011-10-10  
2 A 2011-10-15 2011-10-31
6 C 2011-12-1 2011-12-3
7 C 2011-12-5 2011-12-6

用sql怎样实现??在此十分感谢

作者: so_fantasy   发布时间: 2011-12-08

引用 11 楼 so_fantasy 的回复:
引用 7 楼 qianjin036a 的回复:

SQL code
--那:如果ID连续的话:
select b.单号,a.送修时间,b.维修完成时间
from tb a inner join tb b on a.单号=b.单号+1
where datediff(d,a.送修时间,b.维修完成时间)<=30

如果单号不连续的话,要用row_number()函数创建一个连续的编号,……


按照9喽的方法应该可以。

作者: fredrickhu   发布时间: 2011-12-08