问一个考勤SQL语句的问题,想查询一整月考勤记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问一个考勤SQL语句的问题,想查询一整月考勤记录相关的知识,希望对你有一定的参考价值。

有考勤表如下:
员工ID 考勤时间
001 2013-04-14 07:57:23
002 2013-04-15 08:57:23
软件中想要查询显示结果如下:

1、2、3为当月日期

想要sql查询显示如下:

试了很多方法都不是很理想,谢谢各位了!!!

select 员工ID,a.[1] 上班时间,b.[1] 下班时间,datediff(mm,b.[1] - a.[1]) 累计时间,
a.[2] 上班时间,b.[2] 下班时间,datediff(mm,b.[2] - a.[2]) 累计时间,.......
from

( select 员工ID,上班时间 from 考勤表
pivot ( min( 考勤时间) for datepart(dd, 考勤时间) in ( [1],[2],[3],................... )) as pvt ) a,

( select 员工ID,上班时间 from 考勤表
pivot ( mxn( 考勤时间) for datepart(dd, 考勤时间) in ( [1],[2],[3],................... )) as pvt ) b
where a.员工ID = b.员工ID追问

感谢您的回复,有没有办法不用填写日期,根据选择月份来显示当月考勤明细。比如说:2月为28天,4月为30天,不修改sql语句只告诉它月份就能直接显示当月考勤明细。

追答

写成动态语句,根据月的天数把每天的列拼出来

参考技术A 你这个查询只能分析出正常打卡(不多卡不缺卡)的情况,如有请个;旷工;多卡缺卡等时,你这个分析不是很到位的。我以前也这样处理过,后使用了则科人力资源管理系统,还是花点钱的实在,你也可以在当地找个好点的系统吧。 参考技术B 什么数据库,考勤时间字段什么类型?
还有,怎么判断是上班或者下班?追问

数据库用的是SQL2000
考勤时间字段类型:datetime
上班下班判断,目前想取当日最早打卡为上班时间,最晚打卡为下班时间
只统计整月每天上下班时间和累计上班时间
想自动判断选择月份天数并显示当月考勤明细表

追答

给你写了一个,有点麻烦,我只列了两天的,你可以后续把其他天也加上,代码如下

select 员工id,
max(case when 上班日期=\'01\' then 上班时间 end) "1号上班时间",
max(case when 下班日期=\'01\' then 下班时间 end) "1号下班时间",
max(cast(datediff(minute,
cast((case when 上班日期=\'01\' then 上班时间 end) as datetime),
cast((case when 下班日期=\'01\' then 下班时间 end) as datetime))/60 as varchar)+\'小时\'+
cast(datediff(minute,
cast((case when 上班日期=\'01\' then 上班时间 end) as datetime),
cast((case when 下班日期=\'01\' then 下班时间 end) as datetime))%60 as varchar)+\'分\') "1号累计时间",
max(case when 上班日期=\'02\' then 上班时间 end) "2号上班时间",
max(case when 下班日期=\'02\' then 下班时间 end) "2号下班时间",
max(cast(datediff(minute,
cast((case when 上班日期=\'02\' then 上班时间 end) as datetime),
cast((case when 下班日期=\'02\' then 下班时间 end) as datetime))/60 as varchar)+\'小时\'+
cast(datediff(minute,
cast((case when 上班日期=\'02\' then 上班时间 end) as datetime),
cast((case when 下班日期=\'02\' then 下班时间 end) as datetime))%60 as varchar)+\'分\') "2号累计时间"
from
(select a.员工id,
substring(convert(varchar,a.上班时间,112),7,2) 上班日期,
substring(convert(varchar,a.上班时间,108),1,5) 上班时间,
substring(convert(varchar,a.下班时间,112),7,2) 下班日期,
substring(convert(varchar,a.下班时间,108),1,5) 下班时间
from
(select 员工id,max(考勤时间) 下班时间,min(考勤时间) 上班时间 from 考勤表
where convert(varchar(10),考勤时间,120) like \'2013-04%\'
group by 员工id,convert(varchar(10),考勤时间,120)) a) b
group by 员工id


效果在这,你要嫌麻烦我给你发附件也行

本回答被提问者采纳

sql数据库中多个考勤打卡数据,怎样按考勤号,日期合成一条

每天有不定条数的打卡记录,我怎样才能把它们合成一条,用视图可以实现不,怎么操作

oracle:
select 考勤号,日期,wm_concat(时间) from 表 group by 考勤号,日期
sql:
select stuff((select ',' + 时间
from 表
where 日期 = a.日期
and 考勤卡号 = a.考勤卡号
for XML path('')),
1,
1,
'') 工号,
考勤卡号,
日期
From 表 a
group by 考勤卡号, 日期追问

我想把时间合在一起,类似 张三 0027(卡号) 2016.03.08(日期) 07:00 11:50 13:30 (打卡时间) 这样的

参考技术A select 考勤号,日期 from biao group by 考勤号,日期

以上是关于问一个考勤SQL语句的问题,想查询一整月考勤记录的主要内容,如果未能解决你的问题,请参考以下文章

EF考勤打卡机怎么删除月考勤记录

当日期不在table1中时,SQL查询In/Out考勤与空行

sql数据库中多个考勤打卡数据,怎样按考勤号,日期合成一条

asp.net做考勤系统要用到SQL数据库的job吗

SQL 统计每日上班打卡和下班打卡语句

关于MSSQL1个查询命令