关于考勤的问题

amazeyeli 2012-06-11 11:18:32
IF OBJECT_ID('TEST') IS NOT NULL
DROP TABLE TEST;

CREATE TABLE TEST
(
DATE DATE,
TIME TIME,
NAME NVARCHAR(10)
);

INSERT INTO TEST
select '2012-6-1','7:50','aaa' union all
select '2012-6-1','7:55','bbb' union all
select '2012-6-1','12:10','aaa' union all
select '2012-6-1','12:05','bbb' union all
select '2012-6-1','13:50','aaa' union all
select '2012-6-1','14:05','bbb' union all
select '2012-6-1','18:10','aaa' union all
select '2012-6-1','18:05','bbb';

SELECT A.NAME,A.Normal,B.Later,C.Early,
Neglect = (((DATEDIFF(DAY,'2012-6-1','2012-7-1')-8)*4)-ISNULL(A.Normal,0)-ISNULL(B.Later,0)-ISNULL(C.Early,0))*0.25--旷工
FROM
(
(
SELECT NAME,COUNT([TIME]) AS Normal--正常
FROM TEST
WHERE [TIME] <= '8:00'
OR [TIME] BETWEEN '12:00' AND '14:00'
OR [TIME] >= '18:00'
GROUP BY NAME
) AS A
LEFT JOIN
(
SELECT NAME,COUNT(TIME) AS Later--迟到
FROM TEST
WHERE TIME BETWEEN '8:01' AND '8:30'
OR TIME BETWEEN '14:01' AND '14:30'
GROUP BY NAME
) AS B
ON A.NAME = B.NAME
LEFT JOIN
(
SELECT NAME,COUNT(TIME) AS Early--早退
FROM TEST
WHERE TIME BETWEEN '8:31' AND '11:59'
OR TIME BETWEEN '14:31' AND '17:59'
GROUP BY NAME
) AS C
ON A.NAME = C.NAME
);

--问题1:将 BETWEEN '8:31' AND '11:59' 划分为早退,并不合理
--比如某同事,10:00才来打卡,12:00又打了下班卡,并不属于早退
--该问题应如何解决?

--问题2:一天必须打4次卡,少打一次就按旷工0.25天计算,此方法是否合理?

--问题3:统计周期内的工作日如何得到? 我是查万年历:6月份8个休息日,
--然后算出需要统计周期内的天数再减去休息日得到
...全文
161 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
amazeyeli 2012-06-11
  • 打赏
  • 举报
回复
回3楼,这个不错,谢谢
amazeyeli 2012-06-11
  • 打赏
  • 举报
回复
回2楼,如果忘记打卡,就会没有记录

把select '2012-6-1','12:10','aaa' union all删掉

结果就会这样:

name date 上午上班 上午下班 下午上班 下午下班
aaa 2012-06-01 07:50:00.0000000 13:50:00.0000000 18:10:00.0000000 00:00:00.0000000
bbb 2012-06-01 07:55:00.0000000 12:05:00.0000000 14:05:00.0000000 18:05:00.0000000


Q315054403 2012-06-11
  • 打赏
  • 举报
回复
定规则,改设计。。非几个SQL之力
风一样的大叔 2012-06-11
  • 打赏
  • 举报
回复
以前貌似也有个帖子上有计算工作日的,不错介个
  • 打赏
  • 举报
回复

IF OBJECT_ID('TEST') IS NOT NULL
DROP TABLE TEST;

CREATE TABLE TEST
(
[DATE] DATE,
[TIME] TIME,
NAME NVARCHAR(10)
);

INSERT INTO TEST
select '2012-6-1','7:50','aaa' union all
select '2012-6-1','7:55','bbb' union all
select '2012-6-1','12:10','aaa' union all
select '2012-6-1','12:05','bbb' union all
select '2012-6-1','13:50','aaa' union all
select '2012-6-1','14:05','bbb' union all
select '2012-6-1','18:10','aaa' union all
select '2012-6-1','18:05','bbb';

with t
as(
select *,
px=ROW_NUMBER()over(partition by NAME,[DATE] order by [DATE],[TIME])
from test
)
select name,[date],
MAX(case when px=1 then [TIME] else '' end) as 上午上班,
MAX(case when px=2 then [TIME] else '' end) as 上午下班,
MAX(case when px=3 then [TIME] else '' end) as 下午上班,
MAX(case when px=4 then [TIME] else '' end) as 下午下班
from t
group by name,[date]

/*
name date 上午上班 上午下班 下午上班 下午下班
----------------------------------------------------------------------------------------------------
aaa 2012-06-01 07:50:00.0000000 12:10:00.0000000 13:50:00.0000000 18:10:00.0000000
bbb 2012-06-01 07:55:00.0000000 12:05:00.0000000 14:05:00.0000000 18:05:00.0000000
*/


我觉得这么行列转换一下统计来的直观一点
  • 打赏
  • 举报
回复
我觉得正常就是在上班时间前打卡,下班时间到了后打卡。迟到就是上班后打卡,早退就是下班前打卡。这个可以用case when来判断。
amazeyeli 2012-06-11
  • 打赏
  • 举报
回复
;WITH T
AS
(
SELECT NAME,
CASE
WHEN TIME <= '8:00' THEN '正常'
WHEN TIME BETWEEN '8:01' AND '8:30' THEN '迟到'
WHEN TIME BETWEEN '8:31' AND '11:30' THEN '中途打卡'
WHEN TIME BETWEEN '11:31' AND '11:59' THEN '早退'
WHEN TIME BETWEEN '12:00' AND '14:00' THEN '正常'
WHEN TIME BETWEEN '14:01' AND '14:30' THEN '迟到'
WHEN TIME BETWEEN '14:31' AND '17:30' THEN '中途打卡'
WHEN TIME BETWEEN '17:31' AND '17:59' THEN '早退'
WHEN TIME >= '18:00' THEN '正常'
ELSE '' END AS Notes
FROM TEST
)
SELECT A.NAME,A.正常,B.迟到,C.中途打卡,D.早退
FROM
(
SELECT NAME,COUNT(Notes) AS 正常 FROM T
WHERE Notes = '正常'
GROUP BY NAME
) AS A
LEFT JOIN
(
SELECT NAME,COUNT(Notes) AS 迟到 FROM T
WHERE Notes = '迟到'
GROUP BY NAME
) AS B
ON A.NAME = B.NAME
LEFT JOIN
(
SELECT NAME,COUNT(Notes) AS 中途打卡 FROM T
WHERE Notes = '中途打卡'
GROUP BY NAME
) AS C
ON A.NAME = C.NAME
LEFT JOIN
(
SELECT NAME,COUNT(Notes) AS 早退 FROM T
WHERE Notes = '早退'
GROUP BY NAME
) AS D
ON A.NAME = D.NAME
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

回2楼,如果忘记打卡,就会没有记录

把select '2012-6-1','12:10','aaa' union all删掉

结果就会这样:

name date 上午上班 上午下班 下午上班 下午下班
aaa 2012-06-01 07:50:00.0000000 13:50:00.0000000 18:10:00.0000000 00:00:00.0000000
bbb ……
[/Quote]

是的,然后你可以通过case when 来判断这几个时间了
一、项目简介本课程演示的是一套基于SSM实现的考勤管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。课程包含:1. 项目源码、项目文档、数据库脚本、软件工具等所有资料2. 带你从零开始部署运行本套系统3. 该项目附带的源码资料可作为毕设使用4. 提供技术答疑二、技术实现后台框架:Spring、SpringMVC、MyBatisUI界面:JSP、jQuery 、H-ui数据库:MySQL 三、系统功能该系统共包含两种角色:员工、管理员,主要分为前台和后台两大模块。1.前台模块 前台首页、新闻公告、员工活动、职位招聘、留言板、用户注册、用户登录、个人中心、我的考勤、我的奖惩、我的培训、我的薪资、修改密码等功能。2.后台模块 系统后台登陆、管理员管理、员工信息管理、部门管理、职务管理、考勤类别管理、员工考勤管理、员工奖惩管理、员工培训管理、员工薪资管理、网站栏目管理、网站内容管理、职位招聘管理、求职简历管理、留言交流管理、留言回复管理等功能。该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 四、项目截图1)前台首面2)个人信息页面3)员工信息管理4)考勤类别管理5)考勤信息管理6)员工薪资管理  更多Java毕设项目请关注【毕设系列课程】https://edu.csdn.net/lecturer/2104   
一、系统简介 现代企业分工愈来愈精细、竞争愈来愈激烈,各企业都想尽办法在管理上要效益,而员工考勤烦琐复杂,企业要投入较多的人力、物力、时间,购买打卡钟、打卡、统计,结果费事费力还经常出错.员工考勤成了企业发展的烦恼 。 考勤系统V2.0就是解决企业人事资料管理,员工考勤等一系列问题的软件。本系统采用先进的指纹考勤机作为数据采集设备,数据库选用SQL SERVER 2000,支持Windows 98、Windows NT、Windows 2000/XP等操作平台,因此既适合大型企业使用,也适合中小企业使用。并且该系统还留有考勤结果网上查询等扩充接口。 每位员工上下班时只需将手指在考勤机上轻轻一按,工号、时间等数据即自动记录下来,再上载到计算机后,可通过考勤管理软件进行日结、月结等统计工作,并能生成各种统计报表或可导入到Excel中进行处理。 使用指纹考勤人事系统,可使您的企业用较少的投资即可实现现代化的高效率的管理,并树立良好的企业形象。   二、系统组成 指纹考勤机:采集指纹数据,根据员工人数和出入口的多少决定采用台数。 网络电缆:联网多台考勤机之间的通讯、主考勤机与计算机之间的通讯。 计算机:PC兼容电脑,建议用PC433以上电脑,支持Windows 98、Windows NT、Windows 2000/XP等操作平台。 软件系统:考勤系统V2.0、Access或SQL Server2000数据库。
学生考勤管理系统 需求分析.DOC 作为用户与该系统软件开发维护人员共同遵守的软件需求规范说明,本《软件需求说明书》的主要目的是明确所要开发的软件所应具有的功能、性能,使系统分析人员和软件设计人员能清楚地了解用户的需求,并在此基础上进一步提出概要设计和完成后续设计与开发工作,为软件开发范围、业务处理规范提供依据,也是应用软件进行合同最终验收的依据。 系统对学校全体学生的资料和考勤情况进行管理,通过每日的打卡把出勤信息输入到学校的考勤管理中心,保存学生每日的的出勤情况,以便于统计学生的出勤情况。同时方便班长查阅,即节省了人力,又省去了中间的很多容易出错的步骤。让学校学生的考勤管理更具有透明性,且方便管理。 此外系统还涉及系统数据安全和用户管理的问题、各种代码使用和维护问题、数据安全和数据维护问题、统计报表生成和输出等问题,因此还要求系统具有系统管理和事务处理功能。总而言之,要求通过系统的开发,达到系统项目的总体目标是:在整个系统的框架下,结合学生在学校的实际出勤情况的需要实现对数据更新、数据查询、数据统计、数据分析等功能进行有效的管理。并提供用户友好接口,满足学校管理需求的软件,提高学校对学生的管理效率,从而完善学校的管理制度。 预期的读者就是各类学校的系统管理员或系统求购者,使用前仔细阅读此软件说明是很必要的,以便更好的使用、管理和维护此系统!

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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