当前位置 :
【SQL语句的编写,查询公司所有普通员工某一天第一次的刷卡时间和最后一次刷卡时间的汇总.公司是一个大公司,会有好多各种级别的员工,每天刷卡的时间,位置,和次数都不一样.假设有3种级别,】
10人问答
问题描述:

SQL语句的编写,查询公司所有普通员工某一天第一次的刷卡时间和最后一次刷卡时间的汇总.

公司是一个大公司,会有好多各种级别的员工,每天刷卡的时间,位置,和次数都不一样.

假设有3种级别,老板,经理,和普通员工.

假设公司共有4个门,东南西北各一个,每个门都只有一个进来的读卡器,出去的时候是按钮.

所以也就是说每次打卡都是为了进来,除了最后一次,那必定是为了记录下班时间而打的.

比如,A最早在东门(eastdoor)打卡纪录开始上班,在南门(southdoor)打卡记录下班.

这个数据库里面会有好几个月的数据,而不是一天一天的.

(上班时间信息,普通员工上班时断规定为9:00am-6:00pm

早上10点后进来算旷工,其记录就不需要用作计算,9点到10点之间算迟到)

[目的]查询某一天(比如2013-09-09)所有普通员工的上班(第一次打卡)记录,包括员工姓名,打卡时间,打卡位置,和其下班(最后一次打卡)记录.

情况1:如果有员工忘记下班打卡,也就是跟着别人出去,那么在规定的下班时间之后就不会有这个人的记录,而该员工最后一次的打卡时间就会是在规定下班时间之前,又或者一整天就只有一条进来的记录.

情况2:其情况如第二题,没有下班后的打卡记录,但是有员工是因为加班到第二天早上才打卡出去,但是又不能与其第二天重新进来上班的时间混淆.

总结:如果当天没有下班打卡记录那么就显示第二天的第一条记录.这里要考虑的就是如果该员工在第二天规定上班时间之前有两条打卡的记录,就可适用,但是如果该员工在规定上班时间之后一小时,也就是10点之前只有一条打卡记录的话,前一天就当作早退处理.

希望查询的效果就是如无意外,查询某一天(比如2013-09-09)所有普通员工的上班(第一次打卡)记录,包括员工姓名,打卡时间,打卡位置,和其下班(最后一次打卡)记录.

如有员工这天没有下班时间之后的打卡记录,而其在第二天上班时间之前有2条打卡记录的,就当作加班处理,其查询的下班时间就显示第二天的第一条记录.

满意后要多少分多可以!现在此谢过了~

黄健青回答:
  感觉只能用游标来做,普通的SQL几乎不能实现.
韩立民回答:
  什么是游标?
黄健青回答:
  我现在非常担心,即使我写出了完整的SQL,你如果看不太懂SQL的话,那么也是运行不了的。这样吧,我把核心思路和你说下吧,有什么问题再后续讨论。因为,你的需求比较复杂,我是用存储过程来实现,在这个存储过程里面,有临时表和游标技术。下面说下步骤:假设数据库原始数据为:姓名打卡时间张三2013-09-0909:01:00张三2013-09-0918:00:02李四2013-09-0908:50:00王五2013-09-0910:50:00王五2013-09-0918:51:00赵六2013-09-0909:50:00赵六2013-09-0916:30:00step1:整理,得出每个人的上班时间和下班时间,放在临时表tempBeginEnd里,存储过程接受一个参数日期,记为@queryDateselectname,max(swipingTime)as'endTime',min(swipingTime)as'beginTime'intotempBeginEndfromt_recordsgroupbynamewhereswipingTime=@queryDatestep2:再对临时表tempBeginEnd进行处理,在对上班时间的处理中,如果是9点之前的,则是正常上班9到10点的视为迟到10点以后到的视为旷工SQL语句如下:selectcasewhenbeginTime09:00:00andbeginTime10:00:00then'旷工'endas'上班考勤',casewhenendTime
黄健青回答:
  我现在非常担心,即使我写出了完整的SQL,你如果看不太懂SQL的话,那么也是运行不了的。   这样吧,我把核心思路和你说下吧,有什么问题再后续讨论。   因为,你的需求比较复杂,我是用存储过程来实现,在这个存储过程里面,有临时表和游标技术。   下面说下步骤:   假设数据库原始数据为:   姓名 打卡时间   张三 2013-09-09 09:01:00   李四 2013-09-09 08:50:00   王五 2013-09-09 18:51:00   赵六 2013-09-09 16:30:00step1:整理,得出每个人的上班时间和下班时间,放在临时表tempBeginEnd里,存储过程接受一个参数日期,记为@queryDate   select name,max(swipingTime) as 'endTime' ,min(swipingTime) as 'beginTime' into tempBeginEnd from t_records group by name where swipingTime=@queryDatestep2:再对临时表tempBeginEnd进行处理,   SQL语句如下:   select case when beginTime<09:00:00 then '正常上班'   when beginTime>09:00:00 and beginTime<10:00:00 then '迟到'   when beginTime>10:00:00 then '旷工' end   as '上班考勤',   case when endTime<18:00:00 then '早退' end as '下班考勤'   into temp   from tempBeginEndstep3:但是现在的temp表目前还不能满足需求,要考虑加班   此时要用到游标去遍历,去查询次日早上在9:00之前的刷卡次数是否大于2次,   如果大于2次,则将早退更新成加班   select @folloingCount=count(*) from temp where swipingTime=次日 and swipingTime<10:00:00   if @followingCount>=2 update temp set 下班考勤='加班'
韩立民回答:
  看到你的回答,很用心,真的很感谢,我等的就是这样的回答.但是突然我想到另外一种状况,其实这就是我被要求要解决的最重要问题,那就是如果有人加班到隔天,如何知道呢?我突然发现我设想的上班时间打两次卡有漏洞,那就是要是有人去了趟厕所又回来也可以构成两条或多过两条的打卡记录.我在学校学的真的很有限,全是基本知识,现在要我全权负责这么个庞大的考勤系统,我有点hold不住...
黄健青回答:
  是啊,你之前的在第二天判断是否加班的方法是不太准确的。我帮你想想,看看有没有好的思路。
黄健青回答:
  是这样的,我想了一下,我觉得必须要人为规定当天如果加班,必须在23:59左右打卡,而且在第二天00:01左右再打卡一次,否则无法实现需求。为了更好的说明情况,我举例说明:张三早上正常上班,结果4点早退,第二天早上8点上班。李四早上正常上班,结果加班到第二天早上8点刷第一次打卡出门买早饭。王五早上正常上班,结果下班忘记刷卡,最后刷卡时间为17:00,第二天早上8点上班。那请问这种情况,我如何区分谁是早退?谁是加班?谁是忘记刷卡?根本无法区分,所以必须人为制定刷卡策略:1、如下班忘记刷卡,则记为早退。也许有人觉得不满,但是后果也是它自己造成的,怨不得别人。2、如果加班,必须在当前23:59分前刷卡,以及在次日的0:01左右再打卡,这样在统计时就会大大轻松了。-------------------------------------------------------------------------------------------------------tip:在我们公司,有些人早上迟到就不刷卡,在查到时他们就谎称忘刷了,但是我们领导不管,如果漏刷卡,一律视为迟到处理。所以说,刷卡这东西不能完全依靠系统来做,也要用一些规则来辅助计算。
韩立民回答:
  这个办法不错,就在当天晚上11-12点之间要打卡,隔天0点-1点之间再打卡虽然对员工来讲会不方便,不过一个小时的限定时间应该ok.,但是第二天的下班打卡时间没办法确定假如隔天没上班ok,但隔天要有上班,在八点之前很难算八点之后来也不知道到底是迟到还是下班的时间所以我这么想,如果是隔夜下班的话,要求员工在走的时候连续成功打卡5次时间可以规定在一分钟之内,这样应该可以避免掉上厕所,或者是临时误按吧?
黄健青回答:
  我想了很久,我个人觉得考勤系统只适用用来判断某人上班是否迟到,是否早退,用来计算加班时间,不准确而且难度太大到没有意义去做这件事。依然举几个小例子:张三跨夜加班:0:01刷卡,4点50回家,中午12点过来刷卡上班,18点正常下班。李四未跨夜加班:0:01刷卡上班,4点50刷卡出去买早饭,中午12点出去吃饭,18点正常下班。------------------------------------------------------------------------------------对于上述例子,请问你用SQL能实现张三,李四加班时间吗?张三实际上偷懒了,4点50分就回家了,中午12过来,已经迟到了3小时而李四却勤勤恳恳的从4点50一直干到下班。-----------------------------------------------------------------------------------再举一个极端的例子,王五早上9:00刷了一下卡,然后就出去上网吧打游戏了,然后18:00时又回来刷了一下卡,你能说王五今天一天考勤正常,上了8小时班吗?所以说,门禁考勤这个东西不是太完美,一般情况下,用于判断某人上班是否迟到,是否早退就OK了,至于说判断加班时间等,结合人工处理流程吧,因为加班之类的不是都有申请流程的吗?不可能只凭考勤就断定一个人是否加班了吧?-----------------------------------------------------------------------------------最终解决方案:采取天为唯一结算单位,不允许跨天计算。如果加班,必须在当前0点前刷卡,以及在次日0点后刷卡。取某人刷卡的最小时间和最大时间,最小时间如果小于9,则算正常上班,最小时间如果大于9且小于10,算迟到,最小时间如果大于10,则算旷工。最大时间如果小于18,则算早退最大时间如果大于18,则算正常下班。这个里面是有一些误差的(比如上面张三的例子),不过纵观所有员工的刷卡记录来看,这点误差出现情况较少,是在合理误差范围内的。
最新更新
PC端 | 移动端 | mip端
字典翻译(zidianfy.com)汇总了汉语字典,新华字典,成语字典,组词,词语,在线查字典,中文字典,英汉字典,在线字典,康熙字典等等,是学生查询学习资料的好帮手,是老师教学的好助手。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
电话:  邮箱:
Copyright©2009-2021 字典翻译 zidianfy.com 版权所有 闽ICP备2022014709号-7
lyric 頭條新聞