SQL语句的编写,查询公司所有普通员工某一天第一次的刷卡时间和最后一次刷卡时间的汇总。
公司是一个大公司,会有好多各种级别的员工,每天刷卡的时间,位置,和次数都不一样。假设有3种级别,老板,经理,和普通员工。假设公司共有4个门,东南西北各一个,每个门都只有一...
公司是一个大公司,会有好多各种级别的员工,每天刷卡的时间,位置,和次数都不一样。
假设有3种级别,老板,经理,和普通员工。
假设公司共有4个门,东南西北各一个,每个门都只有一个进来的读卡器,出去的时候是按钮。
所以也就是说每次打卡都是为了进来,除了最后一次,那必定是为了记录下班时间而打的。
比如,A最早在东门(east door)打卡纪录开始上班,在南门(south door)打卡记录下班。
这个数据库里面会有好几个月的数据,而不是一天一天的。
(上班时间信息,普通员工上班时断规定为 9:00am - 6:00 pm
早上10点后进来算旷工,其记录就不需要用作计算,9点到10点之间算迟到)
[目的] 查询某一天(比如2013-09-09)所有普通员工的上班(第一次打卡)记录,包括员工姓名,打卡时间,打卡位置,和其下班(最后一次打卡)记录。
情况1:如果有员工忘记下班打卡,也就是跟着别人出去,那么在规定的下班时间之后就不会有这个人的记录,而该员工最后一次的打卡时间就会是在规定下班时间之前,又或者一整天就只有一条进来的记录。
情况2:其情况如第二题,没有下班后的打卡记录,但是有员工是因为加班到第二天早上才打卡出去,但是又不能与其第二天重新进来上班的时间混淆。
总结:如果当天没有下班打卡记录那么就显示第二天的第一条记录。这里要考虑的就是如果该员工在第二天规定上班时间之前有两条打卡的记录,就可适用,但是如果该员工在规定上班时间之后一小时,也就是10点之前只有一条打卡记录的话,前一天就当作早退处理。
希望查询的效果就是如无意外,简单 查询某一天(比如2013-09-09)所有普通员工的上班(第一次打卡)记录,包括员工姓名,打卡时间,打卡位置,和其下班(最后一次打卡)记录。
如有员工这天没有下班时间之后的打卡记录,而其在第二天上班时间之前有2条打卡记录的,就当作加班处理,其查询的下班时间就显示第二天的第一条记录。
情大神帮忙,满意后要多少分多可以!!!现在此谢过了~ 展开
假设有3种级别,老板,经理,和普通员工。
假设公司共有4个门,东南西北各一个,每个门都只有一个进来的读卡器,出去的时候是按钮。
所以也就是说每次打卡都是为了进来,除了最后一次,那必定是为了记录下班时间而打的。
比如,A最早在东门(east door)打卡纪录开始上班,在南门(south door)打卡记录下班。
这个数据库里面会有好几个月的数据,而不是一天一天的。
(上班时间信息,普通员工上班时断规定为 9:00am - 6:00 pm
早上10点后进来算旷工,其记录就不需要用作计算,9点到10点之间算迟到)
[目的] 查询某一天(比如2013-09-09)所有普通员工的上班(第一次打卡)记录,包括员工姓名,打卡时间,打卡位置,和其下班(最后一次打卡)记录。
情况1:如果有员工忘记下班打卡,也就是跟着别人出去,那么在规定的下班时间之后就不会有这个人的记录,而该员工最后一次的打卡时间就会是在规定下班时间之前,又或者一整天就只有一条进来的记录。
情况2:其情况如第二题,没有下班后的打卡记录,但是有员工是因为加班到第二天早上才打卡出去,但是又不能与其第二天重新进来上班的时间混淆。
总结:如果当天没有下班打卡记录那么就显示第二天的第一条记录。这里要考虑的就是如果该员工在第二天规定上班时间之前有两条打卡的记录,就可适用,但是如果该员工在规定上班时间之后一小时,也就是10点之前只有一条打卡记录的话,前一天就当作早退处理。
希望查询的效果就是如无意外,简单 查询某一天(比如2013-09-09)所有普通员工的上班(第一次打卡)记录,包括员工姓名,打卡时间,打卡位置,和其下班(最后一次打卡)记录。
如有员工这天没有下班时间之后的打卡记录,而其在第二天上班时间之前有2条打卡记录的,就当作加班处理,其查询的下班时间就显示第二天的第一条记录。
情大神帮忙,满意后要多少分多可以!!!现在此谢过了~ 展开
展开全部
感觉只能用游标来做,普通的SQL几乎不能实现。
更多追问追答
追问
什么是游标?
追答
我现在非常担心,即使我写出了完整的SQL,你如果看不太懂SQL的话,那么也是运行不了的。
这样吧,我把核心思路和你说下吧,有什么问题再后续讨论。
因为,你的需求比较复杂,我是用存储过程来实现,在这个存储过程里面,有临时表和游标技术。
下面说下步骤:
假设数据库原始数据为:
姓名 打卡时间
张三 2013-09-09 09:01:00
张三 2013-09-09 18:00:02
李四 2013-09-09 08:50:00
王五 2013-09-09 10:50:00
王五 2013-09-09 18:51:00
赵六 2013-09-09 09:50:00
赵六 2013-09-09 16:30:00
step1:整理,得出每个人的上班时间和下班时间,放在临时表tempBeginEnd里,存储过程接受一个参数日期,记为@queryDate
select name,max(swipingTime) as 'endTime' ,min(swipingTime) as 'beginTime' into tempBeginEnd from t_records group by name where swipingTime=@queryDate
step2:再对临时表tempBeginEnd进行处理,
在对上班时间的处理中,如果是9点之前的,则是正常上班
9到10点的视为迟到
10点以后到的视为旷工
SQL语句如下:
select case when beginTime09:00:00 and beginTime10:00:00 then '旷工' end
as '上班考勤',
case when endTime<18:00:00 then '早退' end as '下班考勤'
into temp
from tempBeginEnd
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那你现在打卡记录的表长什么样子,用的是什么数据库
这个不难,追问里发给我
这个不难,追问里发给我
更多追问追答
追问
现在还不清楚,我刚刚开始接触,真的很谢谢你。
现在知道的就是它是一个大公司,各种级别各种权限都有,暂时我需要做的就是拿出普通级别员工的上下班的时间,如题所示。
还要清除event log。
就先当作员工信息一个表,表里面就是些基本的信息;
读卡器的门一共四个,每个门的打卡记录一个表,
还有一个表,装有员工卡的信息。
数据库用的是SQL2008 R2
追答
这个你又没有具体的情况,而且你自己也不明确要做成什么样子
这让人很难介入啊
理论上来说,通过sql语句很容易实现改需求,
对每一个员工每一天分组之后通过case函数计算它的标记值可以看出是否迟到
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询