求一考勤算法

snlixing 2015-10-19 02:19:13
员工考勤时间如下:
三班倒员工:
甲班:7:00-19:00 乙班:19:00-次日7:00 丙班:次日7:00-19:00
两班倒员工:
早班:7:00-19:00 晚班:19:00-次日7:00
长白班员工:
8:00-17:00
倒班员工考勤只要上够12小时就算出勤,长白班只要够8小时就算考勤,算法怎么写呢?
...全文
414 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
snlixing 2015-10-29
  • 打赏
  • 举报
回复
不能只要满足上够12小时就就出勤一天吗,不用管他是上的什么班次,按月统计出勤该怎么写呢
Tiger_Zhao 2015-10-29
  • 打赏
  • 举报
回复
假定现在是 2015-10-04 00:00,员工A的打卡时间如下,你来判断一下他是怎么上下班的,出勤了几天?
2015-10-01 07:00
2015-10-01 07:01
2015-10-01 19:00
2015-10-02 07:00
2015-10-02 16:69
2015-10-02 17:00
2015-10-03 19:00
沐NeMo 2015-10-28
  • 打赏
  • 举报
回复
考勤问题计算是很麻烦。 在SQLSERVER里面处理,很难实现计算出你要的结果。 你要考虑处理的数据太多了。 倒班很容易的,不就是排班吗。 排班数据放在排班表里面。 每一个员工一天太一个或者多个班都可以。 再分析出打卡记录是否缺齐,才可以计算。否则当异常或者矿工等。 这些想直接在SQLSERVER存储过程里面计算。我认为很难,听说过几千行的一个存储过程,维护修改起来头疼。
yooq_csdn 2015-10-21
  • 打赏
  • 举报
回复
这个算法不是技术人员可以确定的,比如我8:30上班, 我7:30来了打卡。之后去吃早饭,吃完忘了刚刚是否打卡之后又去打了一次。在比如我一天只打了一次卡算迟到还是早退等等。我想提醒你,实际情况是每人除了上下班打开以外还会有产生很多意外的打卡记录,这个是你需要面对的最大困难。这个需要负责考勤的部门在文件上做出规定,之后你按照规定处理就行了。
Tiger_Zhao 2015-10-21
  • 打赏
  • 举报
回复
没有班次你根本分辨不出上下班,尤其是两班倒的人,每天都有两次打卡记录。
Tiger_Zhao 2015-10-20
  • 打赏
  • 举报
回复
加一个啊。
打卡明细只是能算原始数据,不方便统计。
考勤记录表才是正真的业务明细。
snlixing 2015-10-20
  • 打赏
  • 举报
回复
表只有班次表,员工表,打卡明细表,没有考勤记录表
Tiger_Zhao 2015-10-20
  • 打赏
  • 举报
回复
DATEDIFF(minute,c1.上班时间,c2.下班时间)/60
这哪里不是“通过时间来判断”的吗?
snlixing 2015-10-20
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao的回复:
不符合班次设置的,用其它途径调整。
自动计算只适用于符合预设规则的情况。
如果只想满足上够12小时就就出勤一天呢,不用管他是上的什么班次,按月统计出勤该怎么写呢
snlixing 2015-10-20
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao的回复:
假定有以下表
班次表(ID,名称,上班,下班,标准工时,间隔)
员工表(ID,班次ID)
打卡明细(员工ID,打卡时间)
考勤记录(日期,员工ID,班次ID,上班时间,下班时间,工时,出勤状态)

-- 初始化班次表
INSERT INTO 班次表
SELECT 1,'甲班','2015-10-19 07:00','2015-10-19 19:00',12,36 UNION ALL
SELECT 2,'乙班','2015-10-19 19:00','2015-10-20 07:00',12,36 UNION ALL
SELECT 3,'丙班','2015-10-20 07:00','2015-10-20 19:00',12,36 UNION ALL
SELECT 4,'早班','2015-10-19 07:00','2015-10-19 19:00',12,24 UNION ALL
SELECT 5,'晚班','2015-10-19 19:00','2015-10-20 07:00',12,24 UNION ALL
SELECT 6,'白班','2015-10-19 08:00','2015-10-19 17:00',8,24

-- 以 @班次ID为参数,统计考勤记录、递进时间到下个班次
DECLARE @班次ID int

;WITH a AS ( -- 用标准工时的一半来划分上下班区段
SELECT *,
CONVERT(datetime,
CONVERT(varchar(10),GetDate(),120),
120) 日期,
DATEADD(hour,-标准工时/2,上班) 上班开始,
DATEADD(hour,标准工时/2,上班) 上班结束,
DATEADD(hour,-标准工时/2,下班) 下班开始,
DATEADD(hour,标准工时/2,下班) 下班结束
FROM 班次表
WHERE 班次ID = @班次ID
)
,b AS (
SELECT a.日期,
e.员工ID,
e.班次ID,
a.上班开始,
a.上班结束,
a.下班开始,
a.下班结束
FROM a
JOIN 员工表 e
ON a.班次ID = e.班次ID
)
,c1 AS (
SELECT b.日期,
b.员工ID,
b.班次ID,
MIN(d.打卡时间) 上班时间
FROM b
LEFT JOIN 打卡明细 d
ON b.员工ID = d.员工ID
AND d.打卡时间 >= b.上班开始
AND d.打卡时间 < b.上班结束
)
,c2 AS (
SELECT b.日期,
b.员工ID,
b.班次ID,
MAX(d.打卡时间) 下班时间
FROM b
LEFT JOIN 打卡明细 d
ON b.员工ID = d.员工ID
AND d.打卡时间 >= b.下班开始
AND d.打卡时间 < b.下班结束
)
,c AS (
SELECT c1.日期,
c1.员工ID,
c1.班次ID,
c1.上班时间,
c2.下班时间,
CASE WHEN c1.上班时间 IS NULL THEN
NULL
WHEN c2.下班时间 IS NULL THEN
NULL
ELSE
DATEDIFF(minute,c1.上班时间,c2.下班时间)/60
END 工时
FROM c1
JOIN c2
ON c1.员工ID = c2.员工ID
)
INSERT INTO 考勤记录(日期,员工ID,班次ID,上班时间,下班时间,工时,出勤状态)
SELECT c.*,
CASE WHEN ISNULL(c.工时,0) >= a.标准工时 THEN
1
ELSE
0
END -- 如果要更加细分出勤状态,用上班时间、下班时间进行判断
FROM c, a

UPDATE 班次表
SET 上班 = DATEADD(hour,间隔,上班),
下班 = DATEADD(hour,间隔,下班)
WHERE 班次ID = @班次ID
能只通过时间来判断吗,只要上班下班打卡时间大于12小时就算出勤呢
Tiger_Zhao 2015-10-20
  • 打赏
  • 举报
回复
不符合班次设置的,用其它途径调整。
自动计算只适用于符合预设规则的情况。
snlixing 2015-10-20
  • 打赏
  • 举报
回复
如果人员上班不固定呢,比如一共员工上完一共早班后,又加班上了个晚班呢
Tiger_Zhao 2015-10-19
  • 打赏
  • 举报
回复
假定有以下表
班次表(ID,名称,上班,下班,标准工时,间隔)
员工表(ID,班次ID)
打卡明细(员工ID,打卡时间)
考勤记录(日期,员工ID,班次ID,上班时间,下班时间,工时,出勤状态)

-- 初始化班次表
INSERT INTO 班次表
SELECT 1,'甲班','2015-10-19 07:00','2015-10-19 19:00',12,36 UNION ALL
SELECT 2,'乙班','2015-10-19 19:00','2015-10-20 07:00',12,36 UNION ALL
SELECT 3,'丙班','2015-10-20 07:00','2015-10-20 19:00',12,36 UNION ALL
SELECT 4,'早班','2015-10-19 07:00','2015-10-19 19:00',12,24 UNION ALL
SELECT 5,'晚班','2015-10-19 19:00','2015-10-20 07:00',12,24 UNION ALL
SELECT 6,'白班','2015-10-19 08:00','2015-10-19 17:00',8,24

-- 以 @班次ID为参数,统计考勤记录、递进时间到下个班次
DECLARE @班次ID int

;WITH a AS ( -- 用标准工时的一半来划分上下班区段
SELECT *,
CONVERT(datetime,
CONVERT(varchar(10),GetDate(),120),
120) 日期,
DATEADD(hour,-标准工时/2,上班) 上班开始,
DATEADD(hour,标准工时/2,上班) 上班结束,
DATEADD(hour,-标准工时/2,下班) 下班开始,
DATEADD(hour,标准工时/2,下班) 下班结束
FROM 班次表
WHERE 班次ID = @班次ID
)
,b AS (
SELECT a.日期,
e.员工ID,
e.班次ID,
a.上班开始,
a.上班结束,
a.下班开始,
a.下班结束
FROM a
JOIN 员工表 e
ON a.班次ID = e.班次ID
)
,c1 AS (
SELECT b.日期,
b.员工ID,
b.班次ID,
MIN(d.打卡时间) 上班时间
FROM b
LEFT JOIN 打卡明细 d
ON b.员工ID = d.员工ID
AND d.打卡时间 >= b.上班开始
AND d.打卡时间 < b.上班结束
)
,c2 AS (
SELECT b.日期,
b.员工ID,
b.班次ID,
MAX(d.打卡时间) 下班时间
FROM b
LEFT JOIN 打卡明细 d
ON b.员工ID = d.员工ID
AND d.打卡时间 >= b.下班开始
AND d.打卡时间 < b.下班结束
)
,c AS (
SELECT c1.日期,
c1.员工ID,
c1.班次ID,
c1.上班时间,
c2.下班时间,
CASE WHEN c1.上班时间 IS NULL THEN
NULL
WHEN c2.下班时间 IS NULL THEN
NULL
ELSE
DATEDIFF(minute,c1.上班时间,c2.下班时间)/60
END 工时
FROM c1
JOIN c2
ON c1.员工ID = c2.员工ID
)
INSERT INTO 考勤记录(日期,员工ID,班次ID,上班时间,下班时间,工时,出勤状态)
SELECT c.*,
CASE WHEN ISNULL(c.工时,0) >= a.标准工时 THEN
1
ELSE
0
END -- 如果要更加细分出勤状态,用上班时间、下班时间进行判断
FROM c, a

UPDATE 班次表
SET 上班 = DATEADD(hour,间隔,上班),
下班 = DATEADD(hour,间隔,下班)
WHERE 班次ID = @班次ID
shiguangxin 2015-10-19
  • 打赏
  • 举报
回复
重复打卡,迟到,早退,忘记打卡 ...... 啊呀呀 想想都头痛 楼主加油吧
snlixing 2015-10-19
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
三班倒 和 两班倒,看起来,没什么区别啊。
三班倒是一个班上12小时休24小时,两班倒是上12小时休12小时
卖水果的net 版主 2015-10-19
  • 打赏
  • 举报
回复
三班倒 和 两班倒,看起来,没什么区别啊。

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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