c#考勤设计如何把一次刷卡记录表示为上下班记录

c#考勤设计如何把一次刷卡记录表示为上下班记录,第1张

假定数据库有

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来做统计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10127781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存