假定数据库有
id(自增序号)
user(用户名)
am(上午打卡时间)
pm(下午打卡时间)
createtime(默认值getdate(),记录创建时间
这五个字段
当打卡时, 取当前时间至dt
如果dt为有效的上午或者下午打卡时间,则进行下一步,否则提示不为有效打卡时间。
假定当前用户为curruser
从数据数查询出curruser今天的打卡数据(即createtime距离今天0点不超过24小时),假定如果没有找id为0,找到了id则为对应的记录号。
if dt为有效上午打卡时间
{
如果id=0 则插入数据(插入数据包括user,am)
否则如果id>0,则表示用户今天已经打过卡了
}
else if dt为有效下午时间
{
如果id=0 则插入数据(插入数据user,pm);
否则如果id>0,则查询id对应的数据的pm是否为空值,如果为空则更新id那一条的pm,如果不为空则表示用户下午已经打过卡了。
}
这个问题比较复杂,设计到时间点的界定
--建立辅助表
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'worktime' AND type = 'U')
DROP TABLE worktime
GO
create table worktime(id int,workfrom smalldatetime, workend smalldatetime, flag int)
go
declare @a smalldatetime
set @a=0
insert into worktime select 1,dateadd(mi,0860,@a),dateadd(mi,1260,@a),1
insert into worktime select 2,dateadd(mi,1260,@a),dateadd(mi,1360,@a),0
insert into worktime select 2,dateadd(mi,1360,@a),dateadd(mi,1760,@a),1
insert into worktime select 3,dateadd(mi,1760,@a),dateadd(mi,1860,@a),0
insert into worktime select 3,dateadd(mi,1860,@a),dateadd(mi,2060,@a),2
insert into worktime select 4,dateadd(mi,2060,@a),dateadd(mi,22560,@a),1
insert into worktime select 5,dateadd(mi,22560,@a),dateadd(mi,23560,@a),0
insert into worktime select 5,dateadd(mi,23560,@a),dateadd(mi,3560,@a+1),1
insert into worktime select 6,dateadd(mi,3560,@a+1),dateadd(mi,4560,@a+1),0
insert into worktime select 6,dateadd(mi,4560,@a+1),dateadd(mi,560,@a+1),1
insert into worktime select 7,dateadd(mi,560,@a+1),dateadd(mi,860,@a+1),2
----查询
select gzbhid,日期,convert(decimal(3,1),(isnull(sum(datediff(mi,wf1,we)),0)-sum(d1))/600) 上班时间,
convert(decimal(3,1),(isnull(sum(datediff(mi,wf2,we)),0)-sum(d2))/600) 加班时间
from
(select gzbhid,wf1,(case when wf1>wf2 then null else wf2 end) wf2,
(case when datepart(hh,we)<8 then we-1 else we end) we
,(select isnull(sum(datediff(mi,workfrom,workend)),0) from worktime where flag=0
and dateadd(day,datediff(day,workfrom,wf1),workfrom)>wf1
and dateadd(day,datediff(day,workend,we),workend)<we) d1
,(select isnull(sum(datediff(mi,workfrom,workend)),0) from worktime where flag=0
and dateadd(day,datediff(day,workfrom,wf2),workfrom)>wf2
and dateadd(day,datediff(day,workend,we),workend)<we) d2
,convert(varchar(10),(case when datepart(hh,we)<8 then we-1 else we end),20) 日期
from (select ,
(select top 1 (case when dateadd(day,datediff(day,workend,xdates),workfrom)<xdates then
(case when datepart(hh,xdates)<8 then dates-1 else dates end)
else dateadd(day,datediff(day,workfrom,xdates),workfrom) end) from worktime where flag=1
and dateadd(day,datediff(day,workend,xdates2),workfrom)<xdates2
and dateadd(day,datediff(day,workend,xdates),workend)>xdates order by workfrom) wf1
,(select top 1 (case when dateadd(day,datediff(day,workend,xdates),workfrom)<xdates then
(case when datepart(hh,xdates)<8 then dates-1 else dates end)
else dateadd(day,datediff(day,workfrom,xdates),workfrom) end) from worktime where flag=2
and dateadd(day,datediff(day,workend,xdates2),workfrom)<xdates2
and dateadd(day,datediff(day,workend,xdates),workend)>xdates order by workfrom) wf2
,(select top 1 (case when flag=0 then dateadd(day,datediff(day,workend,xdates2),workfrom)
else xdates2 end) from worktime where
dateadd(day,datediff(day,workend,xdates2),workend)>xdates2 order by workend) we
from (select , (select top 1 dates from #kq b where gzbhid=agzbhid and arrid=27361 and dates>adates
and not exists (select 1 from #kq where arrid=27357 and gzbhid=agzbhid and dates>adates
and dates<bdates) order by dates) dates2
from #kq a ) x
where arrid=27357
) x2
) x3
group by 日期,gzbhid
order by 日期,gzbhid
附件是我2009年做的,给你做个参考。
说实话用Excel做这种考勤比较痛苦,因为数据要进行多次判断。
我是用Acess做的宏自动导入每月数据(和你的原数据类似),在Acess中处理,然后将结果导出至Excel。
如果你懂Access,或者SQL等数据库的话,可以尝试以下思路:
1
由于每月日期不同,结果表的列肯定不同。用Cross-Tab查询,日期为列,并将结果导入到一个结果表。每次运行Access的宏会先删除这个表,并从Cross-Table查询重新建立。
2
员工号有效性判断。有些访客也打卡,要把他们剔除!@#¥#!有些卡编号有误,比如前面多个空格,用Trim搞定。
2
员工可能多次打卡,进取first,出取last
(Acess自带函数)
3
多班次判断。比较麻烦的是跨日班次,其他的都比较简单。我是分多班次进行单个分析,然后再用Union将结果统一至一个query
4
剩下就是连接人事DB导出一些部门,姓名的信息,设计一些打印报表。
5
结果表的内容复制到Windows
clipboard。然后通过Excel的宏从clipboard中导出数据并处理一些格式。如果有什么问题可以联系我赛客生活小雅。
问题一:如何制作年度考勤汇总表 先设计好考勤表,可以用横格纸,
纵向32等份,分别写上姓名及1-31天出勤\缺勤O迟到婚假!
丧假-,年休假L周六日+就可以了
问题二:月考勤统计表怎么做? 20分 应该是设计到数据库了吧?
具体你用的是哪福种呢?
SQL那可以用专门的SQL语句 实现
问题提的具体点 有利于别人回答
问题三:考勤报表怎么做 1、序号,姓名,部门,年假,病假,事假,剩余天数。以上是每个月都要体现出来的信息。
2、年假是公司固定的,事、病假是员工当月扣除地。然后每月计算出剩余年假。年假不扣工资。如果没有年假了就扣工资。
问题四:如何利用excel做年度考勤汇总 把每一个月的考勤都复制到同一张工作表中,用月区分。
如图,把表做成这个样子:
接下来就可以用你的公式进行统计了。
问题五:如何用Excel制作考勤统计表 给你个现成的,有多种方式供你选择
问题六:怎么用电脑做考勤表 首先要搞清你是用WORD做吗~~~打开word后, 在你所需插入的地方点击“插入”,在“符号”选项框里找到“勾”,点击“插入”即可。
问题七:怎么用excel简单的做一个考勤表 可以使用WPSdocer在线模板,下载一个考勤表直接进行使用
下载WPS2013,打开表格进入主页,右 上角搜索输入关键词点击即可下载使用
问题八:做考勤表需要些什么函数公式? 1,怎么统计一个月出勤天数,用的是:求和(函数:SUM);具体 *** 作方法,百度有很详细的解说;
2,每天申报加班,怎样查看是否有重复申报的,这个好办啊,你只要将各个部门申报的进行排序后,他申报的就排在一起了,就知道了,
3,怎样查看一个月加班小时是否有超公司控制范围,这个也可以不用函数啊,选中加班总数那一列,进行条件查找,大于规定的、在规格范围之内的分别填充不同的颜色就可以啦,对于“条件查找”的具体 *** 作百度里也有,自己慢慢学。
希望能帮到你。
问题九:员工考勤表格怎么制作? 请到我百度主页参考文章《制作考勤表》
hibaidu/4
有详细制作方法介绍
问题十:请问那位高手详细教一下单位考勤统计表怎么做?谢谢!! 如果使用永益web考勤软件可以直接输出日或月考勤统计表,如果个人制作的话,可使用EXCEL制作表头,将每个人的姓名,工号,正常出勤,迟到,早退,旷工,请假,加班等信息,根据公司要考勤的项列出即可。
以上就是关于c#考勤设计如何把一次刷卡记录表示为上下班记录全部的内容,包括:c#考勤设计如何把一次刷卡记录表示为上下班记录、关于考勤系统 mssql2008、公司上下班考勤表,如何用EXCEL来做统计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)