怎样去判断迟到和早退

xubingjingme 2009-06-12 01:52:27
问题可能很傻,但在做人事系统,没有概念
现在考勤系统提供以下数据,记录考勤的数据

工号 星期 刷卡日期 刷卡时间
440 星期四 2009-6-11 08:18:59
440 星期四 2009-6-11 08:22:59
440 星期四 2009-6-11 17:02:59

上班时间是08:30---17:00

我就是想怎样去判断迟到的,不想死做
...全文
977 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjf30366 2009-08-27
  • 打赏
  • 举报
回复
..
chencane 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fb777 的回复:]
取某人每天的第一条记录,如果时间在08:30以后,就迟到了 ,

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了 ,

如果找不到记录 ,就是旷工.


这样做已经完美了,为什么还要算法?


如果加班到第二天凌晨3点才打卡呢???

人家昨天加班了一通宵,,你给人家当成旷工????

因为昨天他只有早上打卡的那条记录,晚上打卡那次他留到第二天凌晨3点!
[/Quote]

靠,那要是加班的到第二天9点,怎么办?
robake 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 renmms 的回复:]
引用 12 楼 fb777 的回复:
取某人每天的第一条记录,如果时间在08:30以后,就迟到了 ,

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了 ,

如果找不到记录 ,就是旷工.


这样做已经完美了,为什么还要算法?


如果加班到第二天凌晨3点才打卡呢???

人家昨天加班了一通宵,,你给人家当成旷工????

因为昨天他只有早上打卡的那条记录,晚上打卡那次他留到第二天凌晨3点!


公司刷卡机会分进和出的,比如我们公司的就是。

他检查的时间应该是早上第一次刷进,和晚上最后一次刷出
[/Quote]

这个没法分吧,有些人就故意不按通常的习惯来,这个一点辙都没有,像加班超过0点的,可以列之为异常出勤,这种情况毕竟是少数,可以额外记录一下,在程序里增加状态调整功能,在备注里说明一下,基本就可以了。
chencane 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ayzbl 的回复:]
取某人每天的第一条记录,如果时间在08:30以后,就迟到了

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了


这样做有什么问题么?

[/Quote]

对头
robake 2009-08-27
  • 打赏
  • 举报
回复
我刚开发完的考勤查询系统,和你这个一样。

我的办法是:读取每天从0:00开始的第一条打卡记录,列作上班时间,23:59:59前的最后一次打卡记录为下班时间。这样可以避免出现多次打卡的情况。
故,当天没有办法判断早退、旷工等出勤状态,这些要等第二天才能判断。
xupeihuagudulei 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 robake 的回复:]
VB.NET code'判断出勤状态Function cD(ByVal WorkerNOAsString,ByVal rqAsString,ByVal sbtimAsObject,ByVal xbtimAsObject)AsString
cD=""Dim WeekAsString=""
Week=WeekdayName(Weekday(rq))Dim aAsBool¡­
[/Quote]
robake 2009-08-27
  • 打赏
  • 举报
回复
跟我们单位的考勤很类似,只不过我们单位的研发部门是9:00上班,其他的是8:30,楼主你可以参考下我的代码。
robake 2009-08-27
  • 打赏
  • 举报
回复
   '判断出勤状态
Function cD(ByVal WorkerNO As String, ByVal rq As String, ByVal sbtim As Object, ByVal xbtim As Object) As String
cD = ""
Dim Week As String = ""
Week = WeekdayName(Weekday(rq))
Dim a As Boolean = True '正常出勤,正常工作日
If Week = "星期六" Or Week = "星期日" Then
a = False
End If
If ReadDeName(WorkerNO) = "总裁室" Then
cD = "-"
Exit Function
End If


'Response.End()
'Exit Function
If a = True Then
If CheckDepart(ReadDeName(CLng(WorkerNO))) = False Then
If sbtim Is DBNull.Value Then
cD = "漏打卡"
ElseIf DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) <= 0 And DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) > -1800 Then
cD = "迟到"

ElseIf xbtim Is DBNull.Value Then
cD = "漏打卡"
ElseIf sbtim = xbtim Or DateDiff(DateInterval.Second, CDate(sbtim), CDate(xbtim)) <= 1800 Then
cD = "漏打卡"
ElseIf DateDiff(DateInterval.Second, CDate(xbtim), CDate(rq & " 17:30:00")) > 1 And DateDiff(DateInterval.Second, CDate(xbtim), CDate(rq & " 17:30:00")) < 1800 Then
cD = "早退"
ElseIf 1800 <= DateDiff(DateInterval.Second, CDate(xbtim), CDate(rq & " 17:30:00")) Then '旷工
cD = "异常"
ElseIf DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) <= -1800 Then '旷工
cD = "异常"

ElseIf DateDiff(DateInterval.Second, CDate(xbtim), CDate(rq & " 17:30:00")) <= 0 And DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) >= 0 Then
cD = "正常"
End If
Else
If sbtim Is DBNull.Value Then
cD = "漏打卡"

ElseIf xbtim Is DBNull.Value Then
cD = "漏打卡"

ElseIf sbtim = xbtim Or DateDiff(DateInterval.Second, CDate(sbtim), CDate(xbtim)) < 1800 Then
cD = "漏打卡"

ElseIf DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 9:00:00")) <= -1800 Then '旷工
cD = "异常"

ElseIf DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 9:00:00")) <= 0 And DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 9:00:00")) > -1800 Then
cD = "迟到"

ElseIf CLng(cDh(sbtim, xbtim)) > 8 Then
cD = "正常"

ElseIf DateDiff(DateInterval.Second, CDate(sbtim), CDate(xbtim)) <= 13500 Then '旷工
cD = "异常"
ElseIf 32400 > DateDiff(DateInterval.Second, CDate(sbtim), CDate(xbtim)) > 13500 Then
cD = "早退"
Else
cD = "异常"
End If

End If
Else
If sbtim Is DBNull.Value Or xbtim Is DBNull.Value Then
cD = "漏打卡"
Else
cD = "双休加班"
End If
End If



If cD = "漏打卡" And DateDiff(DateInterval.Day, CDate(rq), Now) = 0 Then
'If DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) <= -1800 Then
'cD = "异常"
If CheckDepart(ReadDeName(CLng(WorkerNO))) = False Then
If DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) < 0 And DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 8:30:00")) > -1800 Then
cD = "迟到"
Else
cD = "尚未下班"
End If
ElseIf CheckDepart(ReadDeName(CLng(WorkerNO))) = True Then
If DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 9:00:00")) <= 0 And DateDiff(DateInterval.Second, CDate(sbtim), CDate(rq & " 9:00:00")) > -1800 Then
cD = "迟到"
Else
cD = "尚未下班"
End If
Else
cD = "尚未下班"
End If
ElseIf cD = "漏打卡" And Not xbtim Is DBNull.Value Then
cD = "异常"
End If
If sbtim Is DBNull.Value And xbtim Is DBNull.Value Then
cD = "未出勤"
End If

End Function
AYZBL 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fb777 的回复:]
取某人每天的第一条记录,如果时间在08:30以后,就迟到了 ,

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了 ,

如果找不到记录 ,就是旷工.


这样做已经完美了,为什么还要算法?


如果加班到第二天凌晨3点才打卡呢???

人家昨天加班了一通宵,,你给人家当成旷工????

因为昨天他只有早上打卡的那条记录,晚上打卡那次他留到第二天凌晨3点!
[/Quote]


多做多错,少做少错,极端情况,就让人事小MM自己处理吧
renmms 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fb777 的回复:]
取某人每天的第一条记录,如果时间在08:30以后,就迟到了 ,

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了 ,

如果找不到记录 ,就是旷工.


这样做已经完美了,为什么还要算法?


如果加班到第二天凌晨3点才打卡呢???

人家昨天加班了一通宵,,你给人家当成旷工????

因为昨天他只有早上打卡的那条记录,晚上打卡那次他留到第二天凌晨3点!
[/Quote]

公司刷卡机会分进和出的,比如我们公司的就是。

他检查的时间应该是早上第一次刷进,和晚上最后一次刷出
fb777 2009-06-12
  • 打赏
  • 举报
回复
取某人每天的第一条记录,如果时间在08:30以后,就迟到了 ,

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了 ,

如果找不到记录 ,就是旷工.


这样做已经完美了,为什么还要算法?


如果加班到第二天凌晨3点才打卡呢???

人家昨天加班了一通宵,,你给人家当成旷工????

因为昨天他只有早上打卡的那条记录,晚上打卡那次他留到第二天凌晨3点!
kingssman 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 AYZBL 的回复:]
取某人每天的第一条记录,如果时间在08:30以后,就迟到了

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了


这样做有什么问题么?
[/Quote]

我觉得没问题
xubingjingme 2009-06-12
  • 打赏
  • 举报
回复
但其中也有外出的记录啊
不善^ 2009-06-12
  • 打赏
  • 举报
回复
来的最晚,走的最早
AYZBL 2009-06-12
  • 打赏
  • 举报
回复
取某人每天的第一条记录,如果时间在08:30以后,就迟到了 ,

取某人每天的最后一条记录,如果时间在17:00以前 ,就早退了 ,

如果找不到记录 ,就是旷工.


这样做已经完美了,为什么还要算法?
robake 2009-06-12
  • 打赏
  • 举报
回复
。。。这个用datediff不就可以了么?我刚做完一个类似的内网考勤查询工具,能够判断出迟到、早退、旷工等各种出勤状态。
lw1a2 2009-06-12
  • 打赏
  • 举报
回复
04:00---08:30:有刷卡记录不算迟到
17:00---第二天03:59:有刷卡记录不算早退
纯冰糖 2009-06-12
  • 打赏
  • 举报
回复
要把几个时间段列出来考虑逻辑
xubingjingme 2009-06-12
  • 打赏
  • 举报
回复
这个不重要啊,我只想知道有什么算法吗
plottowan_1977 2009-06-12
  • 打赏
  • 举报
回复
在我的概念里:
比老板来得晚,叫迟到
比老板走得早,叫早退
加载更多回复(2)

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧