现在我有个考勤系统,我要做的操作就是在对考勤数据进行分析的时候,把每天刷卡的数据进行登记,同时分出迟到的数据(‘08:30’--‘08:45’),记入请假表中。
但我现在写的SQL语句,怎么样也不能筛选出迟到的数据。求救拉~~~~~~~~SELECT RS.no, RS.name,RS.bmno,RS.bmmc, kaoqin.kqrq,kaoqin.kqsj FROM kaoqin INNER JOIN RS ON huaqikaoqin.no = RS.no where kqrq='" & DateTime.Date$ & "' and (kaoqin.kqsj>'08:30' and kaoqin.kqsj<='08:45')这是VB中的动态生成的SQL语句,其中数据库中的kqsj,kqrq都是日期型。如果去掉后面的2个条件,可以输出,时间格式为长的全部格式(1899-12-30 08:06:00.000
),加上也不报错,这是没有结果。还有一个问题就比较复杂了,现在我有2张表,一张是每天经过过滤的刷卡流水表,一张是请假表。现在我要求全月每个工作日都有刷卡记录的人,怎么样在流水表中,以最快的效率得到全勤的数据。我现在想的就是把每个人提出来,看他有多少条记录,和每个工作日比一下,如果没有空的,就显示出来。这样很费时间,200个人,做一下要比6000次呢。
不知道各位高手还有什么别的办法,哪怕是在每天下载考勤数据的时候做记录标记也行。

解决方案 »

  1.   

    kaoqin.kqsj>'08:30' 要将kaoqin.kqsj格式成时间之后再比较!!
      

  2.   

    怎么变,SQL中的字符和日期是隐性转化的,不需要变啊!!!!!!!!
      

  3.   

    都很简单么。第一个问题:
    如果你的数据库是SQL SERVER,那么你可以使用
    Convert(varchar(19),kqsj,121) 将 kqsj转为一个VARCHAR(19)型的字段(形如 '2004-05-06 15:20:25'),然后再通过substring取它的相应位,与你限定的时间范围比较。改写后SQL语句全文如下:SELECT RS.no, RS.name,RS.bmno,RS.bmmc, kaoqin.kqrq,kaoqin.kqsj FROM kaoqin INNER JOIN RS ON huaqikaoqin.no = RS.no where kqrq='" & DateTime.Date$ & "' and 
    substring(convert(varchar(19),kaoqin.kqsj,121),12,5) > '08:30' and substring(convert(varchar(19),kaoqin.kqsj,121),12,5) <= '08:45'第二个问题,更简单了。只要你懂得GROUP BY 和HAVING 子句的用法,一句SQL搞定。SELECT RS.no, RS.name,RS.bmno,RS.bmmc, count(kaoqin.kqrq ) as 出勤天数
    FROM kaoqin INNER JOIN RS ON huaqikaoqin.no = RS.no
    where kqrq like '2004-05%'   --这里是月份条件
    group by RS.no, RS.name,RS.bmno,RS.bmmc
    having count(kaoqin.kqrq )>=22    --这里是工作日总数条件
      

  4.   

    这个吗,还要试一下,很谢谢你。叫他自己选一下每个月的工作日,然后算天数,这个办法很好,但我怕会有错,因为我从考勤机上筛选的数据,还是有问题的,比如前面一天有人在凌晨刷的卡,考勤机就会记录到下面一个日期里,早上再刷的时候,数据就会放在已经有的时候后面,舒特的考勤系统建的数据库太垃圾了,时间全是CHAR的,而且可以刷很多次卡,时间就一个接一个的放在后面,所以取的时候很麻烦。有时我就会取到前面一天夜里刷的数据,当作今天的记录了。要是能规范这个数据,其他的就很简单了。
      

  5.   

    谁能帮我想想,怎么样过滤舒特的垃圾数据啊。由于现在我不能直接访问考勤机,只有用舒特的考勤软件下载后,通过我的过滤程序,把刷了多次的记录滤掉,但就我写的过滤程序还是不行,老有前一夜的数据,怎么样才能成功过滤不必要的数据啊'菜单_数据处理_下载
    Private Sub menu_down_Click()
        Set sRs = New ADODB.Recordset
        Set sTemp = New ADODB.Recordset
        
        sTemp.Open "select zhdate from dlzh where seled=1", Module.sConn, adOpenKeyset, adLockOptimistic
        sTemp.Requery
        
        sRs.Open "select no,skrq,sksj from kqbrush" & sTemp.Fields(0).Value & " where skrq='" & DateTime.Date$ & "' and no IS NOT NULL", sConn, adOpenKeyset, adLockOptimistic
        sRs.Requery
        
        sTemp.Close
        sTemp.Open "select * from kaoqin", Module.sConn, adOpenKeyset, adLockOptimistic
        sTemp.Requery
        
        '先判断今天数据是否下载,如果已经下载,则不做更新。如果没有就先判断时间是否在正常时间段,再做更新导入。
        Do While (Not sRs.EOF)
            If log_check(sRs.Fields(0).Value, sRs.Fields(1).Value) = True Then
                If CDate(Left(sRs.Fields(2).Value, 5)) > CDate("07:00") And CDate(Left(sRs.Fields(2).Value, 5)) <= CDate("08:45") Then
                    sTemp.AddNew
                    sTemp.Fields(0).Value = sRs.Fields(0).Value
                    sTemp.Fields(1).Value = Format(sRs.Fields(1).Value, "yyyy-mm-dd")
                    sTemp.Fields(2).Value = Format(Left(sRs.Fields(2).Value, 5), "hh:mm")
                    sTemp.Update
                    sTemp.Requery
                Else
                    If Len(sRs.Fields(2).Value) > 7 Then
                        sTemp.AddNew
                        sTemp.Fields(0).Value = sRs.Fields(0).Value
                        sTemp.Fields(1).Value = Format(sRs.Fields(1).Value, "yyyy-mm-dd")
                        sTemp.Fields(2).Value = Format(Mid(sRs.Fields(2).Value, 7, 5), "hh:mm")
                        sTemp.Update
                        sTemp.Requery
                    End If
                End If
            End If
            sRs.MoveNext
        Loop
        
        sTemp.Close
        Set sTemp = New ADODB.Recordset
        sTemp.Open "SELECT RS.no, RS.name,RS.bmno,RS.bmmc, kaoqin.kqrq,kaoqin.kqsj FROM kaoqin INNER JOIN RS ON kaoqin.no = RS.no where kaoqin.kqrq='" & DateTime.Date$ & "' and (substring(convert(varchar(19),kaoqin.kqsj,121),12,5) > '08:30' and substring(convert(varchar(19),kaoqin.kqsj,121),12,5) <= '08:45')", sConn, adOpenKeyset, adLockOptimistic
            
        If Not (sTemp.EOF = True And sTemp.BOF = True) Then
            sRs.Close
            sRs.Open "select * from furlough", Module.sConn, adOpenKeyset, adLockOptimistic
            sRs.Requery
            sRs.AddNew
            sRs.Fields(1) = sTemp.Fields(0).Value
            sRs.Fields(2) = sTemp.Fields(1).Value
            sRs.Fields(3) = sTemp.Fields(2).Value
            sRs.Fields(4) = sTemp.Fields(3).Value
            sRs.Fields(5) = 0
            sRs.Fields(6) = "迟到"
            sRs.Fields(7) = sTemp.Fields(4).Value
            sRs.Fields(8) = sTemp.Fields(4).Value
            sRs.Fields(9) = 0
            sRs.Fields(11) = ""
            sRs.Update
            sRs.Requery
        End If
            
        sTemp.Close
            
        MsgBox "数据下载成功,请登记当天请假人员名单!", vbOKOnly + vbQuestion, "考勤提示"
    End Sub
    '判断今天的记录是否下载
    Public Function log_check(noid As String, date_time As String) As Boolean
        Set sRsTemp = New ADODB.Recordset
        sRsTemp.Open "select * from kaoqin where no='" & noid & "' and kqrq='" & date_time & "'", Module.sConn, adOpenKeyset, adLockOptimistic
        sRsTemp.Requery
        
        If sRsTemp.EOF = True And sRsTemp.BOF = True Then
            log_check = True
        Else
            log_check = False
        End If
        
        sRsTemp.Close
    End Function