首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

sql 查询缺少的数据,如何个查法

2013-04-20 
sql 查询缺少的数据,怎么个查法请指教表ABC字段:idtimeanli12013/1/29 14:20:001022013/1/29 14:25:004032

sql 查询缺少的数据,怎么个查法请指教
表ABC
字段:
id      time                              anli
1       2013/1/29 14:20:00      10
2       2013/1/29 14:25:00      40
3       2013/1/29 14:30:00      15
4       2013/1/29 14:35:00      10
5       2013/1/29 14:45:00      11
6       2013/1/29 15:05:00      36

现在的情况是anli的值是5分钟一个数据自动入库的,但是他中间有的时候会丢失数据,比如第4条到第5条之间缺一条2013/1/29 14:40:00的数据  第5条到第6条间缺3条数据,现在用SQL查出这里缺的数据并显示缺数的时间,请高手帮忙,我是VB弄的小程序来查的,但是弄到这里就不懂了
[解决办法]


'首先查询到最大和最小值
Dim dt As Date
Set rs = cn.Execute("SELECT Min([time]) As mintime, Max([time]) As maxtime FROM ABC")

'然后循环查询
For dt = rs!mintime To rs!maxtime Stemp CDate("00:05:00")
    Set rs = cn.Execute("SELECT * FROM ABC WHERE [time] = #" & Format(dt, "yyyy-mm-dd HH:nn:ss") & "#")
    If rs.EOF Then Debug.Print Format(dt, "yyyy-mm-dd HH:nn:ss")
Next dt

[解决办法]
For dt = rs!mintime To rs!maxtime Step CDate("00:05:00") 

从数据库表中查到的最小时间,循环到最大时间,步长是 5 分钟。

当然,由于最小时间和最大时间是数据库中查到的,必定存在,似乎不必查对。仅仅是为了简单而已。

实际上,从最小时间 + 5 分钟,循环到最大时间 - 5 分钟即可。
[解决办法]
If 语句如果在 Then 后面换了行,就需要 End If 来结束代码段。

    If Adodc1.Recordset.EOF Then
    Debug.Print Format(dt, "yyyy-mm-dd HH:nn:ss")
    End If
[解决办法]
为什么没人吐槽全循环的效率?
数据过滤是 SQL 的强项啊!
-- 直接用 SQL 查询缺失的时间段
-- 找不存在大5分钟记录的时间 A,A + 5分钟 即为缺失时间段的开始
-- 找大于 A 的最小时间 B,B - 5分钟 即为缺失时间段的结束
-- 下面是 SQL Server 的,其他数据库自己转换
SELECT DateAdd(minute, 5, [time]) begin_time,
       (SELECT DateAdd(minute, -5, MIN([time]))
          FROM TABLE1 T2
         WHERE T2.[time] > T1.[time]) end_time
  FROM TABLE1 T1
 WHERE NOT EXISTS (SELECT *
                     FROM TABLE1 T3
                    WHERE T3.[time] = DateAdd(minute, 5, T1.[time]))

查询结果:
begin_time             ,end_time


2013-01-29 14:40:00.000,2013-01-29 14:40:00.000
2013-01-29 14:50:00.000,2013-01-29 15:00:00.000
2013-01-29 15:10:00.000,<NULL>


Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim dt As Date
...
Set rs = cn.Execute("...") '上面的 SQL
While Not rs.EOF
    If Not IsNull(rs!end_time) Then '排除最后一个段落
        For dt = CDate(rs!begin_time) To CDate(rs!end_time) Step CDate("00:05:00")
            Debug.Print dt
        Next
    End If
    
    rs.MoveNext
Wend

热点排行