现在我有个考勤系统,我要做的操作就是在对考勤数据进行分析的时候,把每天刷卡的数据进行登记,同时分出迟到的数据(‘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次呢。
不知道各位高手还有什么别的办法,哪怕是在每天下载考勤数据的时候做记录标记也行。
但我现在写的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次呢。
不知道各位高手还有什么别的办法,哪怕是在每天下载考勤数据的时候做记录标记也行。
如果你的数据库是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 --这里是工作日总数条件
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