日期:2014-05-19  浏览次数:20472 次

怎样查询缺少的数据?(新手)
ssid                       datetime
1                             2006-07-20   13:28:02.000
1                             2006-07-20   13:29:03.000
1                             2006-07-20   13:31:00.000

本来应该每1分钟有1条记录,怎样查出哪个时间段的数据丢失了?
2006-07-20   13:30:00.000



------解决方案--------------------
create table T(ssid int, [date] datetime)
insert T select 1, '2006-07-20 13:28:02.000 '
union all select 1, '2006-07-20 13:29:03.000 '
union all select 1, '2006-07-20 13:31:00.000 '

declare @tb table([date] datetime)
declare @maxDT datetime, @minDT datetime
select @maxDT=max([date]), @minDT=min([date])
from T
while @minDT <=@maxDT
begin
insert @tb values(@minDT)
set @minDT=dateadd(minute, 1, @minDT)
end
insert @tb values(@minDT)

select tmp.* from @tb as tmp
left join T on convert(char(16), T.[date], 120)=convert(char(16), tmp.[date], 120)
where T.[date] is null

--result
date
------------------------------------------------------
2006-07-20 13:30:02.000

(1 row(s) affected)

------解决方案--------------------
思路大致是:新建一临时表@tb table([date] datetime)
设置最小时间为(@minDT)
select @maxDT=max([date]), @minDT=min([date])
from T
while @minDT <=@maxDT
begin
insert @tb values(@minDT)
然后从最小时间开始+1分钟set @minDT=dateadd(minute, 1, @minDT) 条件是while @minDT <=@maxDT
这样相当于从最小时间开始--最大时间,记录每一分钟的一个表
查询在临时表中有但在你原表中没有的记录就是你想要的记录.

呵呵,说的有点罗嗦,:)