日期:2014-05-18 浏览次数:20745 次
select name, sum(case when datepart(hh,endtime)>9 then 1 else 0 end) as 迟到次数 from tb group by name
------解决方案--------------------
这样??
-- ============================================= -- Author: T.O.P -- Create date: 2009/11/26 -- Version: SQL SERVER 2005 -- ============================================= declare @TB table([name] varchar(4),[starttime] datetime,[endtime] datetime,[wtime] datetime) insert @TB select 'lily','2009-1-1 9:00:00','2009-1-1 9:10:00','2009-1-1 9:02:00' union all select 'lily','2009-1-1 9:00:00','2009-1-1 9:10:00','2009-1-1 9:02:00' union all select 'lily','2009-1-1 9:00:00','2009-1-1 9:10:00','2009-1-1 8:02:00' union all select 'lily','2009-1-1 9:00:00','2009-1-1 9:10:00','2009-1-1 8:02:00' union all select 'lily','2009-1-1 9:00:00','2009-1-1 9:10:00','2009-1-1 8:02:00' union all select 'lily','2009-1-1 9:00:00','2009-1-1 9:10:00','2009-1-1 9:02:00' select count(*) as 迟到次数 from @TB where wtime between starttime and [endtime] --测试结果: /* 迟到次数 ----------- 3 (1 row(s) affected) */
------解决方案--------------------
select count(*) from 表名 where starttime between (上班时间,下班时间) or endtime between (上班时间,下班时间)
------解决方案--------------------
SELECT DATETIME(HOUR,STARTTME,ENDTIME) 取时差,
SELECT DATEDIFF(MINUTE,GETDATE(),'2009-11-26 12:00') 取分差。
像是你要加入条件来判断午休时间。
这就是我的建议,
------解决方案--------------------
楼主最好把考勤表的结构和测试数据写出来,这样才能更好更快的解决问题!O(∩_∩)O哈哈~
------解决方案--------------------
如果是统计是否迟到,写一个函数,取上班时间,用CONVERT(NVARCHAR(12),GETDATE(),120)取到当前日期。假如这个函数叫GETSTANDARDTIME()。
可以用SELECT * FROM TABLE WHERE DATEDIFF(MINUTE,GETSTANDRDTIME(),STARTTIME)<0 这个就是迟到的,当然,你也可以用前台程序来处理标准上班时间。
上一条回复的函数也是DATEDIFF,我写错了,抱歉
------解决方案--------------------
其实 不必要这样头痛医头脚痛医脚的
你写一个考勤数据分析的程序 分析出每人每日的考勤信息
如果 你需要统计一段时间内的某样考勤信息时 你只需要汇总统计一下日报表的数据
这样处理能提供比较灵活的报表处理形式 而且你不必要在每次统计的时候又去分析原始数据
当领导需要某一样功能时 你只需要在日考勤报表中增加这个分析统计功能就可以了
这样既方便又灵活 我建议你这样做