考勤问题,有班次,有工作日历,有打卡记录,如何做考勤分析

时间:2021-05-16 11:15:42
考勤问题,有班次,有工作日历,有打卡记录,如何做考勤分析


--班次
CREATE TABLE [dbo].[BANCI](
[Code] [nvarchar](20) NOT NULL,
[Item] [int] NOT NULL,
[KTIME] [nvarchar](20) NULL,
[KSTA] [nvarchar](20) NULL,
[KLST] [nvarchar](20) NULL
) ON [PRIMARY]

--打卡记录
CREATE TABLE [dbo].[CardList](
[Emp] [nvarchar](20) NULL,
[CDate] [nvarchar](20) NULL,
[CardTime] [nvarchar](20) NULL
) ON [PRIMARY]

--工作日历
CREATE TABLE [dbo].[WorkDate](
[Emp] [nvarchar](20) NULL,
[CDate] [nvarchar](20) NULL,
[Banci] [nvarchar](20) NULL
) ON [PRIMARY]



等一下我整理些数据出来

25 个解决方案

#2


取出打卡记录,根据班次,工作日历来一个一个分析

#3


全是nvarchar--最好用日期類型

#4


刚才没写好


--班次
CREATE TABLE [dbo].[BANCI](
[Code] [nvarchar](20) NOT NULL,  --代码
[Item] [int] NOT NULL,  --项
[Ctype] [nvarchar](20) NULL,  --类型
[KTIME] [nvarchar](20) NULL,  --标准时间
[KSTA] [nvarchar](20) NULL,  --允许开始打卡时间
[KLST] [nvarchar](20) NULL,  --允许最后打卡时间
 CONSTRAINT [PK_BANCI] PRIMARY KEY CLUSTERED 
(
[Code] ASC,
[Item] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


--打卡记录
CREATE TABLE [dbo].[CardList](
[Emp] [nvarchar](20) NOT NULL,  --卡号
[CDate] [nvarchar](20) NOT NULL,  --打卡日期
[CardTime] [nvarchar](20) NOT NULL,  --打卡时间
 CONSTRAINT [PK_CardList] PRIMARY KEY CLUSTERED 
(
[Emp] ASC,
[CDate] ASC,
[CardTime] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

--工作日历
CREATE TABLE [dbo].[WorkDate](
[Emp] [nvarchar](20) NOT NULL,--卡号
[CDate] [nvarchar](20) NOT NULL,  --日期
[Banci] [nvarchar](20) NULL,  --班次
 CONSTRAINT [PK_WorkDate] PRIMARY KEY CLUSTERED 
(
[Emp] ASC,
[CDate] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]





#5


最好貼數據,看你這結構真不會猜。

如果有沒有卡重復,日期為什麼是字符,存儲內容是,一個人同一天可上幾個班等等

#7



INSERT INTO BANCI(Code, Item, Ctype, KTIME, KSTA, KLST)
select '10',1,'上午上班','8:00','7:00','8:30' union all
select '10',2,'上午下班','12:00','11:30','12:14' union all
select '10',3,'下午上班','13:30','12:15','14:00' union all
select '10',4,'下午下班','17:30','17:00','17:59' union all
select '10',5,'加班上班','18:00','18:00','' union all
select '10',6,'加班下班','','','' 

--注:加班是*加班的,有打卡就算加班,没打卡就不用加班


INSERT INTO CardList(Emp, CDate, CardTime)
select 'YXX0004','2011-08-01','07:55' union all
select 'YXX0004','2011-08-01','12:02' union all
select 'YXX0004','2011-08-01','12:20' union all
select 'YXX0004','2011-08-01','17:32' union all
select 'YXX0004','2011-08-02','08:02' union all
select 'YXX0004','2011-08-02','12:02' union all
select 'YXX0004','2011-08-02','12:18' union all
select 'YXX0004','2011-08-03','08:02' union all
select 'YXX0004','2011-08-03','12:03' union all
select 'YXX0004','2011-08-03','12:19' union all
select 'YXX0004','2011-08-03','17:32' union all
select 'YXX0004','2011-08-04','08:00' union all
select 'YXX0004','2011-08-04','12:02' union all
select 'YXX0004','2011-08-04','12:20' union all
select 'YXX0004','2011-08-04','17:32' union all
select 'YXX0004','2011-08-05','07:59' union all
select 'YXX0004','2011-08-05','12:02' union all
select 'YXX0004','2011-08-05','12:19' union all
select 'YXX0004','2011-08-05','17:34' union all
select 'YXX0004','2011-08-07','08:01' union all
select 'YXX0004','2011-08-07','12:00' union all
select 'YXX0004','2011-08-07','12:11' union all
select 'YXX0004','2011-08-07','17:31' union all
select 'YXX0004','2011-08-08','07:56' union all
select 'YXX0004','2011-08-08','12:02' union all
select 'YXX0004','2011-08-08','12:19' union all
select 'YXX0004','2011-08-08','17:34' union all
select 'YXX0004','2011-08-09','07:56' union all
select 'YXX0004','2011-08-09','12:02' union all
select 'YXX0004','2011-08-09','12:18' union all
select 'YXX0004','2011-08-09','17:32' union all
select 'YXX0004','2011-08-10','08:03' union all
select 'YXX0004','2011-08-10','12:02' union all
select 'YXX0004','2011-08-10','12:18' union all
select 'YXX0004','2011-08-10','17:33' union all
select 'YXX0004','2011-08-11','07:57' union all
select 'YXX0004','2011-08-11','12:11' union all
select 'YXX0004','2011-08-11','12:25' union all
select 'YXX0004','2011-08-11','17:36' union all
select 'YXX0004','2011-08-12','07:58' union all
select 'YXX0004','2011-08-12','12:01' union all
select 'YXX0004','2011-08-12','12:19' union all
select 'YXX0004','2011-08-12','17:33' union all
select 'YXX0004','2011-08-14','08:00' union all
select 'YXX0004','2011-08-14','12:00' union all
select 'YXX0004','2011-08-14','12:09' union all
select 'YXX0004','2011-08-14','17:30' union all
select 'YXX0004','2011-08-15','07:57' union all
select 'YXX0004','2011-08-15','12:01' union all
select 'YXX0004','2011-08-15','12:18' union all
select 'YXX0004','2011-08-15','17:32' union all
select 'YXX0004','2011-08-16','07:57' union all
select 'YXX0004','2011-08-16','12:01' union all
select 'YXX0004','2011-08-16','12:20' union all
select 'YXX0004','2011-08-16','17:33' union all
select 'YXX0004','2011-08-17','08:03' union all
select 'YXX0004','2011-08-17','12:01' union all
select 'YXX0004','2011-08-17','17:33' union all
select 'YXX0004','2011-08-18','08:00' union all
select 'YXX0004','2011-08-18','12:02' union all
select 'YXX0004','2011-08-18','13:00' union all
select 'YXX0004','2011-08-18','17:31' union all
select 'YXX0004','2011-08-19','07:57' union all
select 'YXX0004','2011-08-19','12:01' union all
select 'YXX0004','2011-08-19','12:19' union all
select 'YXX0004','2011-08-19','17:33' union all
select 'YXX0004','2011-08-21','08:00' union all
select 'YXX0004','2011-08-21','12:00' union all
select 'YXX0004','2011-08-21','12:14' union all
select 'YXX0004','2011-08-21','17:30' union all
select 'YXX0004','2011-08-22','07:55' union all
select 'YXX0004','2011-08-22','12:02' union all
select 'YXX0004','2011-08-22','12:20' union all
select 'YXX0004','2011-08-22','17:34' union all
select 'YXX0004','2011-08-23','07:56' union all
select 'YXX0004','2011-08-23','12:02' union all
select 'YXX0004','2011-08-23','12:19' union all
select 'YXX0004','2011-08-23','17:32' union all
select 'YXX0004','2011-08-24','08:00' union all
select 'YXX0004','2011-08-24','12:02' union all
select 'YXX0004','2011-08-24','12:19' union all
select 'YXX0004','2011-08-24','17:32' union all
select 'YXX0004','2011-08-25','07:57' union all
select 'YXX0004','2011-08-25','12:02' union all
select 'YXX0004','2011-08-25','12:19' union all
select 'YXX0004','2011-08-25','17:32' union all
select 'YXX0004','2011-08-26','07:56' union all
select 'YXX0004','2011-08-26','12:02' union all
select 'YXX0004','2011-08-26','12:19' union all
select 'YXX0004','2011-08-26','17:33' union all
select 'YXX0004','2011-08-28','07:58' union all
select 'YXX0004','2011-08-28','12:03' union all
select 'YXX0004','2011-08-28','17:31' union all
select 'YXX0004','2011-08-29','07:57' union all
select 'YXX0004','2011-08-29','12:02' union all
select 'YXX0004','2011-08-29','12:19' union all
select 'YXX0004','2011-08-29','17:33' union all
select 'YXX0004','2011-08-30','07:57' union all
select 'YXX0004','2011-08-30','12:01' union all
select 'YXX0004','2011-08-30','12:16' union all
select 'YXX0004','2011-08-30','17:32' union all
select 'YXX0004','2011-08-31','08:00' union all
select 'YXX0004','2011-08-31','12:01' union all
select 'YXX0004','2011-08-31','12:17' union all
select 'YXX0004','2011-08-31','17:32' 

INSERT INTO WorkDate(Emp, CDate, Banci)
select 'YXX0004','2011-08-01','10' union all
select 'YXX0004','2011-08-02','10' union all
select 'YXX0004','2011-08-03','10' union all
select 'YXX0004','2011-08-04','10' union all
select 'YXX0004','2011-08-05','10' union all
select 'YXX0004','2011-08-06',NULL union all
select 'YXX0004','2011-08-07','10' union all
select 'YXX0004','2011-08-08','10' union all
select 'YXX0004','2011-08-09','10' union all
select 'YXX0004','2011-08-10','10' union all
select 'YXX0004','2011-08-11','10' union all
select 'YXX0004','2011-08-12','10' union all
select 'YXX0004','2011-08-13',NULL union all
select 'YXX0004','2011-08-14','10' union all
select 'YXX0004','2011-08-15','10' union all
select 'YXX0004','2011-08-16','10' union all
select 'YXX0004','2011-08-17','10' union all
select 'YXX0004','2011-08-18','10' union all
select 'YXX0004','2011-08-19','10' union all
select 'YXX0004','2011-08-20',NULL union all
select 'YXX0004','2011-08-21','10' union all
select 'YXX0004','2011-08-22','10' union all
select 'YXX0004','2011-08-23','10' union all
select 'YXX0004','2011-08-24','10' union all
select 'YXX0004','2011-08-25','10' union all
select 'YXX0004','2011-08-26','10' union all
select 'YXX0004','2011-08-27',NULL union all
select 'YXX0004','2011-08-28','10' union all
select 'YXX0004','2011-08-29','10' union all
select 'YXX0004','2011-08-30','10' union all
select 'YXX0004','2011-08-31','10' 

--班次为NULL,表示这天不用上班

#8


引用 6 楼 roy_88 的回复:
參照
http://topic.csdn.net/u/20111012/14/e16ec358-61ca-46e4-ac3e-d7339a0f5404.html


我有看了,可是没看懂啊,大版 

#9


原始数据有问题吧,Emp都是YXX0004,都是同一个人?

#10


引用 9 楼 ap0405140 的回复:
原始数据有问题吧,Emp都是YXX0004,都是同一个人?


呵呵,我现在只抓一个人来做测试的,数据没问题的

#11


考勤分析需要得到什么结果?

#12


判断一个人每天的打卡状态:正常、迟到、早退、未打卡

以上这四个可以判断出来

后来我会再加上"补卡","请假"....

#13


不知你要什么格式的,

select a.emp,b.cdate,c.ctype+': '+
case when cast(a.cardtime as datetime) between cast(c.KSTA as datetime) and cast(c.KLST as datetime) then '正常'
else '未刷卡' end 'ctype'
from 
(select row_number() over(partition by cdate order by cardtime) rn,* from CardList) a 
inner join WorkDate b on a.emp=b.emp and a.cdate=b.cdate
inner join BANCI c on b.banci=c.code and a.rn=c.item
where b.banci is not null 

emp                  cdate                ctype
-------------------- -------------------- ----------------------------
YXX0004              2011-08-01           上午上班: 正常
YXX0004              2011-08-01           上午下班: 正常
YXX0004              2011-08-01           下午上班: 正常
YXX0004              2011-08-01           下午下班: 正常
YXX0004              2011-08-02           上午上班: 正常
YXX0004              2011-08-02           上午下班: 正常
YXX0004              2011-08-02           下午上班: 正常
YXX0004              2011-08-03           上午上班: 正常
YXX0004              2011-08-03           上午下班: 正常
YXX0004              2011-08-03           下午上班: 正常
YXX0004              2011-08-03           下午下班: 正常
YXX0004              2011-08-04           上午上班: 正常
YXX0004              2011-08-04           上午下班: 正常
YXX0004              2011-08-04           下午上班: 正常
YXX0004              2011-08-04           下午下班: 正常
YXX0004              2011-08-05           上午上班: 正常
YXX0004              2011-08-05           上午下班: 正常
YXX0004              2011-08-05           下午上班: 正常
YXX0004              2011-08-05           下午下班: 正常
YXX0004              2011-08-07           上午上班: 正常
YXX0004              2011-08-07           上午下班: 正常
YXX0004              2011-08-07           下午上班: 未刷卡
YXX0004              2011-08-07           下午下班: 正常
YXX0004              2011-08-08           上午上班: 正常
YXX0004              2011-08-08           上午下班: 正常
YXX0004              2011-08-08           下午上班: 正常
YXX0004              2011-08-08           下午下班: 正常
YXX0004              2011-08-09           上午上班: 正常
YXX0004              2011-08-09           上午下班: 正常
YXX0004              2011-08-09           下午上班: 正常
YXX0004              2011-08-09           下午下班: 正常
YXX0004              2011-08-10           上午上班: 正常
YXX0004              2011-08-10           上午下班: 正常
YXX0004              2011-08-10           下午上班: 正常
YXX0004              2011-08-10           下午下班: 正常
YXX0004              2011-08-11           上午上班: 正常
YXX0004              2011-08-11           上午下班: 正常
YXX0004              2011-08-11           下午上班: 正常
YXX0004              2011-08-11           下午下班: 正常
YXX0004              2011-08-12           上午上班: 正常
YXX0004              2011-08-12           上午下班: 正常
YXX0004              2011-08-12           下午上班: 正常
YXX0004              2011-08-12           下午下班: 正常
YXX0004              2011-08-14           上午上班: 正常
YXX0004              2011-08-14           上午下班: 正常
YXX0004              2011-08-14           下午上班: 未刷卡
YXX0004              2011-08-14           下午下班: 正常
YXX0004              2011-08-15           上午上班: 正常
YXX0004              2011-08-15           上午下班: 正常
YXX0004              2011-08-15           下午上班: 正常
YXX0004              2011-08-15           下午下班: 正常
YXX0004              2011-08-16           上午上班: 正常
YXX0004              2011-08-16           上午下班: 正常
YXX0004              2011-08-16           下午上班: 正常
YXX0004              2011-08-16           下午下班: 正常
YXX0004              2011-08-17           上午上班: 正常
YXX0004              2011-08-17           上午下班: 正常
YXX0004              2011-08-17           下午上班: 未刷卡
YXX0004              2011-08-18           上午上班: 正常
YXX0004              2011-08-18           上午下班: 正常
YXX0004              2011-08-18           下午上班: 正常
YXX0004              2011-08-18           下午下班: 正常
YXX0004              2011-08-19           上午上班: 正常
YXX0004              2011-08-19           上午下班: 正常
YXX0004              2011-08-19           下午上班: 正常
YXX0004              2011-08-19           下午下班: 正常
YXX0004              2011-08-21           上午上班: 正常
YXX0004              2011-08-21           上午下班: 正常
YXX0004              2011-08-21           下午上班: 未刷卡
YXX0004              2011-08-21           下午下班: 正常
YXX0004              2011-08-22           上午上班: 正常
YXX0004              2011-08-22           上午下班: 正常
YXX0004              2011-08-22           下午上班: 正常
YXX0004              2011-08-22           下午下班: 正常
YXX0004              2011-08-23           上午上班: 正常
YXX0004              2011-08-23           上午下班: 正常
YXX0004              2011-08-23           下午上班: 正常
YXX0004              2011-08-23           下午下班: 正常
YXX0004              2011-08-24           上午上班: 正常
YXX0004              2011-08-24           上午下班: 正常
YXX0004              2011-08-24           下午上班: 正常
YXX0004              2011-08-24           下午下班: 正常
YXX0004              2011-08-25           上午上班: 正常
YXX0004              2011-08-25           上午下班: 正常
YXX0004              2011-08-25           下午上班: 正常
YXX0004              2011-08-25           下午下班: 正常
YXX0004              2011-08-26           上午上班: 正常
YXX0004              2011-08-26           上午下班: 正常
YXX0004              2011-08-26           下午上班: 正常
YXX0004              2011-08-26           下午下班: 正常
YXX0004              2011-08-28           上午上班: 正常
YXX0004              2011-08-28           上午下班: 正常
YXX0004              2011-08-28           下午上班: 未刷卡
YXX0004              2011-08-29           上午上班: 正常
YXX0004              2011-08-29           上午下班: 正常
YXX0004              2011-08-29           下午上班: 正常
YXX0004              2011-08-29           下午下班: 正常
YXX0004              2011-08-30           上午上班: 正常
YXX0004              2011-08-30           上午下班: 正常
YXX0004              2011-08-30           下午上班: 正常
YXX0004              2011-08-30           下午下班: 正常
YXX0004              2011-08-31           上午上班: 正常
YXX0004              2011-08-31           上午下班: 正常
YXX0004              2011-08-31           下午上班: 正常
YXX0004              2011-08-31           下午下班: 正常

#14



select a.emp,b.cdate,c.ctype+': '+
case 
when cast(a.cardtime as datetime) between cast(c.KSTA as datetime) and cast(c.KLST as datetime) then '正常'
when cast(a.cardtime as datetime)>cast(c.KLST as datetime) then '迟到'
when cast(a.cardtime as datetime)<cast(c.KSTA as datetime) then '早退'
else '未打卡' end 'ctype'
from 
(select row_number() over(partition by cdate order by cardtime) rn,* from CardList) a 
inner join WorkDate b on a.emp=b.emp and a.cdate=b.cdate
inner join BANCI c on b.banci=c.code and a.rn=c.item
where b.banci is not null 

emp                  cdate                ctype
-------------------- -------------------- ----------------------------
YXX0004              2011-08-01           上午上班: 正常
YXX0004              2011-08-01           上午下班: 正常
YXX0004              2011-08-01           下午上班: 正常
YXX0004              2011-08-01           下午下班: 正常
YXX0004              2011-08-02           上午上班: 正常
YXX0004              2011-08-02           上午下班: 正常
YXX0004              2011-08-02           下午上班: 正常
YXX0004              2011-08-03           上午上班: 正常
YXX0004              2011-08-03           上午下班: 正常
YXX0004              2011-08-03           下午上班: 正常
YXX0004              2011-08-03           下午下班: 正常
YXX0004              2011-08-04           上午上班: 正常
YXX0004              2011-08-04           上午下班: 正常
YXX0004              2011-08-04           下午上班: 正常
YXX0004              2011-08-04           下午下班: 正常
YXX0004              2011-08-05           上午上班: 正常
YXX0004              2011-08-05           上午下班: 正常
YXX0004              2011-08-05           下午上班: 正常
YXX0004              2011-08-05           下午下班: 正常
YXX0004              2011-08-07           上午上班: 正常
YXX0004              2011-08-07           上午下班: 正常
YXX0004              2011-08-07           下午上班: 早退
YXX0004              2011-08-07           下午下班: 正常
YXX0004              2011-08-08           上午上班: 正常
YXX0004              2011-08-08           上午下班: 正常
YXX0004              2011-08-08           下午上班: 正常
YXX0004              2011-08-08           下午下班: 正常
YXX0004              2011-08-09           上午上班: 正常
YXX0004              2011-08-09           上午下班: 正常
YXX0004              2011-08-09           下午上班: 正常
YXX0004              2011-08-09           下午下班: 正常
YXX0004              2011-08-10           上午上班: 正常
YXX0004              2011-08-10           上午下班: 正常
YXX0004              2011-08-10           下午上班: 正常
YXX0004              2011-08-10           下午下班: 正常
YXX0004              2011-08-11           上午上班: 正常
YXX0004              2011-08-11           上午下班: 正常
YXX0004              2011-08-11           下午上班: 正常
YXX0004              2011-08-11           下午下班: 正常
YXX0004              2011-08-12           上午上班: 正常
YXX0004              2011-08-12           上午下班: 正常
YXX0004              2011-08-12           下午上班: 正常
YXX0004              2011-08-12           下午下班: 正常
YXX0004              2011-08-14           上午上班: 正常
YXX0004              2011-08-14           上午下班: 正常
YXX0004              2011-08-14           下午上班: 早退
YXX0004              2011-08-14           下午下班: 正常
YXX0004              2011-08-15           上午上班: 正常
YXX0004              2011-08-15           上午下班: 正常
YXX0004              2011-08-15           下午上班: 正常
YXX0004              2011-08-15           下午下班: 正常
YXX0004              2011-08-16           上午上班: 正常
YXX0004              2011-08-16           上午下班: 正常
YXX0004              2011-08-16           下午上班: 正常
YXX0004              2011-08-16           下午下班: 正常
YXX0004              2011-08-17           上午上班: 正常
YXX0004              2011-08-17           上午下班: 正常
YXX0004              2011-08-17           下午上班: 迟到
YXX0004              2011-08-18           上午上班: 正常
YXX0004              2011-08-18           上午下班: 正常
YXX0004              2011-08-18           下午上班: 正常
YXX0004              2011-08-18           下午下班: 正常
YXX0004              2011-08-19           上午上班: 正常
YXX0004              2011-08-19           上午下班: 正常
YXX0004              2011-08-19           下午上班: 正常
YXX0004              2011-08-19           下午下班: 正常
YXX0004              2011-08-21           上午上班: 正常
YXX0004              2011-08-21           上午下班: 正常
YXX0004              2011-08-21           下午上班: 早退
YXX0004              2011-08-21           下午下班: 正常
YXX0004              2011-08-22           上午上班: 正常
YXX0004              2011-08-22           上午下班: 正常
YXX0004              2011-08-22           下午上班: 正常
YXX0004              2011-08-22           下午下班: 正常
YXX0004              2011-08-23           上午上班: 正常
YXX0004              2011-08-23           上午下班: 正常
YXX0004              2011-08-23           下午上班: 正常
YXX0004              2011-08-23           下午下班: 正常
YXX0004              2011-08-24           上午上班: 正常
YXX0004              2011-08-24           上午下班: 正常
YXX0004              2011-08-24           下午上班: 正常
YXX0004              2011-08-24           下午下班: 正常
YXX0004              2011-08-25           上午上班: 正常
YXX0004              2011-08-25           上午下班: 正常
YXX0004              2011-08-25           下午上班: 正常
YXX0004              2011-08-25           下午下班: 正常
YXX0004              2011-08-26           上午上班: 正常
YXX0004              2011-08-26           上午下班: 正常
YXX0004              2011-08-26           下午上班: 正常
YXX0004              2011-08-26           下午下班: 正常
YXX0004              2011-08-28           上午上班: 正常
YXX0004              2011-08-28           上午下班: 正常
YXX0004              2011-08-28           下午上班: 迟到
YXX0004              2011-08-29           上午上班: 正常
YXX0004              2011-08-29           上午下班: 正常
YXX0004              2011-08-29           下午上班: 正常
YXX0004              2011-08-29           下午下班: 正常
YXX0004              2011-08-30           上午上班: 正常
YXX0004              2011-08-30           上午下班: 正常
YXX0004              2011-08-30           下午上班: 正常
YXX0004              2011-08-30           下午下班: 正常
YXX0004              2011-08-31           上午上班: 正常
YXX0004              2011-08-31           上午下班: 正常
YXX0004              2011-08-31           下午上班: 正常
YXX0004              2011-08-31           下午下班: 正常

#15


引用 14 楼 ap0405140 的回复:
SQL code


select a.emp,b.cdate,c.ctype+': '+
case 
when cast(a.cardtime as datetime) between cast(c.KSTA as datetime) and cast(c.KLST as datetime) then '正常'
when cast(a.cardtime as datetime)>ca……


8-2和8-17都有一次未打卡

#16


USE tempdb
go
WITH a
AS
(
SELECT 
a.[Emp],
a.[Banci],
a.CDate,
-- b.[KSTA] AS [KSTA],
-- c.CardTime,
打卡状态=case when CAST(c.[CardTime] AS DATETIME)<=[KTIME] and right(b.Ctype,2)=N'上班' then N'正常'
when CAST(c.[CardTime] AS DATETIME)>[KTIME] and right(b.Ctype,2)=N'上班' then N'迟到'
when CAST(c.[CardTime] AS DATETIME)>=[KTIME] and right(b.Ctype,2)=N'下班' then N'正常'
when CAST(c.[CardTime] AS DATETIME)<[KTIME] and right(b.Ctype,2)=N'下班' then N'早退'
else N'未打卡' end,
b.Ctype
FROM [WorkDate] AS a
INNER JOIN [BANCI] AS b ON a.[Banci]=b.[Code]
LEFT  JOIN [CardList] AS c ON c.Emp=a.Emp AND c.CDate=a.CDate AND CAST(c.[CardTime] AS DATETIME) BETWEEN b.[KSTA] AND b.[KLST]
)
SELECT 
*
FROM a
PIVOT (MAX(打卡状态) FOR Ctype IN(上午上班,上午下班,下午上班,下午下班,加班上班,加班下班)) AS b 


/*
Emp Banci CDate 上午上班 上午下班 下午上班 下午下班 加班上班 加班下班
YXX0004 10 2011-08-01 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-02 迟到 正常 正常 未打卡 未打卡 未打卡
YXX0004 10 2011-08-03 迟到 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-04 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-05 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-07 迟到 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-08 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-09 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-10 迟到 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-11 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-12 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-14 正常 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-15 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-16 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-17 迟到 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-18 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-19 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-21 正常 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-22 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-23 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-24 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-25 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-26 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-28 正常 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-29 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-30 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-31 正常 正常 正常 正常 未打卡 未打卡
*/

#17


谢谢大版啊,太厉害了

#18


楼主这个问题,其实可以在考勤机里面做标识.就行了.没必要这样写

#19


引用 18 楼 chirea 的回复:
楼主这个问题,其实可以在考勤机里面做标识.就行了.没必要这样写


一般考勤机只有刷卡,没有其它按键来标识上班、下班的。

#20



同维考勤软件将考勤机的数据接收后,人事系统中的考勤数据接收将考勤记录接收保存到数据服务器的Personnel\data\Bak\ZDATA.DBF数据表中,然后将RECORD.DAT文件按时间备份后再删除,以免重复接收。对于ZDATA.DBF数据表,如果不考虑数据量的问题,可以一直存入此文件中,也可以通过手工备份的方法,按年份将数据备份出来(数据备份截至到每年的12.25)。
 员工每日排班,存放于YGPB.DBF数据表中,
其中需要每日排班的部门是:部门编号前两位为:'22','42','43','44','51','52','46','62',需要排班部门员工必须每日排班,公休日或休息也必须排班(休息)。
其他不需要排班部门的员工,可以手工排班,也可以由电脑自动生成(在考勤分析当天上班信息时,如果为非排班部门的员工且没有排班信息,也不是公休日,则自动添加一条排班记录(日班))。
 请假数据:QJYD.DBF
 公出公差:GCYD.DBF
 加班数据:JBYD.DBF
 公休日 :GGJR.DBF
 忘刷卡 :WSK.DBF
 考勤刷卡数据:ZDATA.DBF
二、 具体处理
1. 可以分析处理某一区间段的考勤数据(不要跨月分析)。
2. 将区间的考勤数据提取到临时文件中,考虑到夜班的问题,提取时,将多取前一天及后一天的考勤刷卡数据。
3. 在分析第一天数据时,会自动删除前一天夜班、加班下班准点2小时内的刷卡数据,以取得正确的上班刷卡记录。(如排班为8:00—00:00,且加班00:00-02:00,则会将4:00以前的刷卡数据删除) (如排班为8:00—23:30,则会将1:30以前的刷卡数据删除),以此类推。
4. 考虑到某一员工存在多次刷卡问题,在分析数据时,对于10分钟内有n次刷卡记录的,只保存最后一次刷卡记录。
5. 对于当月到职员工,只从到职日开始分析处理,且当天上班不算忘记刷卡。
6. 对于当月离职员工,只分析到离职日为止,且当天下班不算忘记刷卡。
7. 由于驾驶员的特殊情况,所以驾驶员所有考勤设为正常。
8. 在考勤分析当天上班信息时,如果为非排班部门的员工且没有排班信息,也不是公休日,则自动添加一条日班的排班记录。
9. 对于当天没有收到考勤数据的,不作分析处理。
10. 所有分析都是基于人事基础档(RSRY)中的是否刷卡标志(lskf),仅当需要刷卡时才进行数据分析。
处理流程详见\\Ntserver2\sccpcdata$\Personnel\data\考勤分析处理.vsd


[img=http://b77.photo.store.qq.com/psb?/V12oA7pv2OuJDK/ioAhiTV4xadxeNNEo99wxBQY36npIGcLgYrLOFox1ps!/b/YTBZ6C0BlAAAYpMA8y2enQAA][/img]

http://b83.photo.store.qq.com/psb?/V12oA7pv2OuJDK/91Thgnqcs*1TFHSmRzxJGq3Hrnm6Q.OptvFXc9R5atc!/b/YciijDEwGwAAYpxnfTG7GwAA

[img=http://b77.photo.store.qq.com/psb?/V12oA7pv2OuJDK/MUO3hNjwt1NKrdRaja6PSE6LYLOvrO3HpiGV9gzmGdc!/b/YTwG8y2gngAAYkya9y2VnwAA][/img]

#21


算了,自己到这个地方看图片吧

http://user.qzone.qq.com/628315/infocenter#!app=4

#22


谢谢大家

#23


depno    Emp                  CardNo               CDate                上午上班                 状态                   上午下班                 状态                   下午上班                 状态                   下午下班                 状态                   加班上班                 状态                   加班下班                 状态
----------------------------------------------------------------------------------------------------------------------------------------------------------------
0417 YXX0004 080801 2011-10-03 08:01 12:03 12:15 17:33
0417 YXX0004 080801 2011-10-04 07:56 12:03 12:21 19:45
0417 YXX0004 080801 2011-10-05 07:57 12:02 12:22 17:34
0417 YXX0004 080801 2011-10-06 请假 请假 请假 请假
0417 YXX0004 080801 2011-10-07 07:58 12:04 12:20 17:33
0417 YXX0004 080801 2011-10-09 07:57 未打卡 13:29 17:31
0417 YXX0004 080801 2011-10-10 08:00 12:05 12:19 17:34
0417 YXX0004 080801 2011-10-11 07:57 12:02 12:19 17:35
0417 YXX0004 080801 2011-10-12 07:59 12:03 12:17 17:32
0417 YXX0004 080801 2011-10-13 07:57 12:03 12:19 17:32
0417 YXX0004 080801 2011-10-14 07:29 12:03 12:18 17:33
0417 YXX0004 080801 2011-10-16 出差 出差 出差 出差
0417 YXX0004 080801 2011-10-17 出差 出差 出差 出差
0417 YXX0004 080801 2011-10-18 出差 出差 13:24 手工签卡 17:36 手工签卡
0417 YXX0004 080801 2011-10-19 07:55 手工签卡 12:06 手工签卡 未打卡 未打卡

#24


学习了

#25


这贴是谁结的?

#1


#2


取出打卡记录,根据班次,工作日历来一个一个分析

#3


全是nvarchar--最好用日期類型

#4


刚才没写好


--班次
CREATE TABLE [dbo].[BANCI](
[Code] [nvarchar](20) NOT NULL,  --代码
[Item] [int] NOT NULL,  --项
[Ctype] [nvarchar](20) NULL,  --类型
[KTIME] [nvarchar](20) NULL,  --标准时间
[KSTA] [nvarchar](20) NULL,  --允许开始打卡时间
[KLST] [nvarchar](20) NULL,  --允许最后打卡时间
 CONSTRAINT [PK_BANCI] PRIMARY KEY CLUSTERED 
(
[Code] ASC,
[Item] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


--打卡记录
CREATE TABLE [dbo].[CardList](
[Emp] [nvarchar](20) NOT NULL,  --卡号
[CDate] [nvarchar](20) NOT NULL,  --打卡日期
[CardTime] [nvarchar](20) NOT NULL,  --打卡时间
 CONSTRAINT [PK_CardList] PRIMARY KEY CLUSTERED 
(
[Emp] ASC,
[CDate] ASC,
[CardTime] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

--工作日历
CREATE TABLE [dbo].[WorkDate](
[Emp] [nvarchar](20) NOT NULL,--卡号
[CDate] [nvarchar](20) NOT NULL,  --日期
[Banci] [nvarchar](20) NULL,  --班次
 CONSTRAINT [PK_WorkDate] PRIMARY KEY CLUSTERED 
(
[Emp] ASC,
[CDate] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]





#5


最好貼數據,看你這結構真不會猜。

如果有沒有卡重復,日期為什麼是字符,存儲內容是,一個人同一天可上幾個班等等

#6


#7



INSERT INTO BANCI(Code, Item, Ctype, KTIME, KSTA, KLST)
select '10',1,'上午上班','8:00','7:00','8:30' union all
select '10',2,'上午下班','12:00','11:30','12:14' union all
select '10',3,'下午上班','13:30','12:15','14:00' union all
select '10',4,'下午下班','17:30','17:00','17:59' union all
select '10',5,'加班上班','18:00','18:00','' union all
select '10',6,'加班下班','','','' 

--注:加班是*加班的,有打卡就算加班,没打卡就不用加班


INSERT INTO CardList(Emp, CDate, CardTime)
select 'YXX0004','2011-08-01','07:55' union all
select 'YXX0004','2011-08-01','12:02' union all
select 'YXX0004','2011-08-01','12:20' union all
select 'YXX0004','2011-08-01','17:32' union all
select 'YXX0004','2011-08-02','08:02' union all
select 'YXX0004','2011-08-02','12:02' union all
select 'YXX0004','2011-08-02','12:18' union all
select 'YXX0004','2011-08-03','08:02' union all
select 'YXX0004','2011-08-03','12:03' union all
select 'YXX0004','2011-08-03','12:19' union all
select 'YXX0004','2011-08-03','17:32' union all
select 'YXX0004','2011-08-04','08:00' union all
select 'YXX0004','2011-08-04','12:02' union all
select 'YXX0004','2011-08-04','12:20' union all
select 'YXX0004','2011-08-04','17:32' union all
select 'YXX0004','2011-08-05','07:59' union all
select 'YXX0004','2011-08-05','12:02' union all
select 'YXX0004','2011-08-05','12:19' union all
select 'YXX0004','2011-08-05','17:34' union all
select 'YXX0004','2011-08-07','08:01' union all
select 'YXX0004','2011-08-07','12:00' union all
select 'YXX0004','2011-08-07','12:11' union all
select 'YXX0004','2011-08-07','17:31' union all
select 'YXX0004','2011-08-08','07:56' union all
select 'YXX0004','2011-08-08','12:02' union all
select 'YXX0004','2011-08-08','12:19' union all
select 'YXX0004','2011-08-08','17:34' union all
select 'YXX0004','2011-08-09','07:56' union all
select 'YXX0004','2011-08-09','12:02' union all
select 'YXX0004','2011-08-09','12:18' union all
select 'YXX0004','2011-08-09','17:32' union all
select 'YXX0004','2011-08-10','08:03' union all
select 'YXX0004','2011-08-10','12:02' union all
select 'YXX0004','2011-08-10','12:18' union all
select 'YXX0004','2011-08-10','17:33' union all
select 'YXX0004','2011-08-11','07:57' union all
select 'YXX0004','2011-08-11','12:11' union all
select 'YXX0004','2011-08-11','12:25' union all
select 'YXX0004','2011-08-11','17:36' union all
select 'YXX0004','2011-08-12','07:58' union all
select 'YXX0004','2011-08-12','12:01' union all
select 'YXX0004','2011-08-12','12:19' union all
select 'YXX0004','2011-08-12','17:33' union all
select 'YXX0004','2011-08-14','08:00' union all
select 'YXX0004','2011-08-14','12:00' union all
select 'YXX0004','2011-08-14','12:09' union all
select 'YXX0004','2011-08-14','17:30' union all
select 'YXX0004','2011-08-15','07:57' union all
select 'YXX0004','2011-08-15','12:01' union all
select 'YXX0004','2011-08-15','12:18' union all
select 'YXX0004','2011-08-15','17:32' union all
select 'YXX0004','2011-08-16','07:57' union all
select 'YXX0004','2011-08-16','12:01' union all
select 'YXX0004','2011-08-16','12:20' union all
select 'YXX0004','2011-08-16','17:33' union all
select 'YXX0004','2011-08-17','08:03' union all
select 'YXX0004','2011-08-17','12:01' union all
select 'YXX0004','2011-08-17','17:33' union all
select 'YXX0004','2011-08-18','08:00' union all
select 'YXX0004','2011-08-18','12:02' union all
select 'YXX0004','2011-08-18','13:00' union all
select 'YXX0004','2011-08-18','17:31' union all
select 'YXX0004','2011-08-19','07:57' union all
select 'YXX0004','2011-08-19','12:01' union all
select 'YXX0004','2011-08-19','12:19' union all
select 'YXX0004','2011-08-19','17:33' union all
select 'YXX0004','2011-08-21','08:00' union all
select 'YXX0004','2011-08-21','12:00' union all
select 'YXX0004','2011-08-21','12:14' union all
select 'YXX0004','2011-08-21','17:30' union all
select 'YXX0004','2011-08-22','07:55' union all
select 'YXX0004','2011-08-22','12:02' union all
select 'YXX0004','2011-08-22','12:20' union all
select 'YXX0004','2011-08-22','17:34' union all
select 'YXX0004','2011-08-23','07:56' union all
select 'YXX0004','2011-08-23','12:02' union all
select 'YXX0004','2011-08-23','12:19' union all
select 'YXX0004','2011-08-23','17:32' union all
select 'YXX0004','2011-08-24','08:00' union all
select 'YXX0004','2011-08-24','12:02' union all
select 'YXX0004','2011-08-24','12:19' union all
select 'YXX0004','2011-08-24','17:32' union all
select 'YXX0004','2011-08-25','07:57' union all
select 'YXX0004','2011-08-25','12:02' union all
select 'YXX0004','2011-08-25','12:19' union all
select 'YXX0004','2011-08-25','17:32' union all
select 'YXX0004','2011-08-26','07:56' union all
select 'YXX0004','2011-08-26','12:02' union all
select 'YXX0004','2011-08-26','12:19' union all
select 'YXX0004','2011-08-26','17:33' union all
select 'YXX0004','2011-08-28','07:58' union all
select 'YXX0004','2011-08-28','12:03' union all
select 'YXX0004','2011-08-28','17:31' union all
select 'YXX0004','2011-08-29','07:57' union all
select 'YXX0004','2011-08-29','12:02' union all
select 'YXX0004','2011-08-29','12:19' union all
select 'YXX0004','2011-08-29','17:33' union all
select 'YXX0004','2011-08-30','07:57' union all
select 'YXX0004','2011-08-30','12:01' union all
select 'YXX0004','2011-08-30','12:16' union all
select 'YXX0004','2011-08-30','17:32' union all
select 'YXX0004','2011-08-31','08:00' union all
select 'YXX0004','2011-08-31','12:01' union all
select 'YXX0004','2011-08-31','12:17' union all
select 'YXX0004','2011-08-31','17:32' 

INSERT INTO WorkDate(Emp, CDate, Banci)
select 'YXX0004','2011-08-01','10' union all
select 'YXX0004','2011-08-02','10' union all
select 'YXX0004','2011-08-03','10' union all
select 'YXX0004','2011-08-04','10' union all
select 'YXX0004','2011-08-05','10' union all
select 'YXX0004','2011-08-06',NULL union all
select 'YXX0004','2011-08-07','10' union all
select 'YXX0004','2011-08-08','10' union all
select 'YXX0004','2011-08-09','10' union all
select 'YXX0004','2011-08-10','10' union all
select 'YXX0004','2011-08-11','10' union all
select 'YXX0004','2011-08-12','10' union all
select 'YXX0004','2011-08-13',NULL union all
select 'YXX0004','2011-08-14','10' union all
select 'YXX0004','2011-08-15','10' union all
select 'YXX0004','2011-08-16','10' union all
select 'YXX0004','2011-08-17','10' union all
select 'YXX0004','2011-08-18','10' union all
select 'YXX0004','2011-08-19','10' union all
select 'YXX0004','2011-08-20',NULL union all
select 'YXX0004','2011-08-21','10' union all
select 'YXX0004','2011-08-22','10' union all
select 'YXX0004','2011-08-23','10' union all
select 'YXX0004','2011-08-24','10' union all
select 'YXX0004','2011-08-25','10' union all
select 'YXX0004','2011-08-26','10' union all
select 'YXX0004','2011-08-27',NULL union all
select 'YXX0004','2011-08-28','10' union all
select 'YXX0004','2011-08-29','10' union all
select 'YXX0004','2011-08-30','10' union all
select 'YXX0004','2011-08-31','10' 

--班次为NULL,表示这天不用上班

#8


引用 6 楼 roy_88 的回复:
參照
http://topic.csdn.net/u/20111012/14/e16ec358-61ca-46e4-ac3e-d7339a0f5404.html


我有看了,可是没看懂啊,大版 

#9


原始数据有问题吧,Emp都是YXX0004,都是同一个人?

#10


引用 9 楼 ap0405140 的回复:
原始数据有问题吧,Emp都是YXX0004,都是同一个人?


呵呵,我现在只抓一个人来做测试的,数据没问题的

#11


考勤分析需要得到什么结果?

#12


判断一个人每天的打卡状态:正常、迟到、早退、未打卡

以上这四个可以判断出来

后来我会再加上"补卡","请假"....

#13


不知你要什么格式的,

select a.emp,b.cdate,c.ctype+': '+
case when cast(a.cardtime as datetime) between cast(c.KSTA as datetime) and cast(c.KLST as datetime) then '正常'
else '未刷卡' end 'ctype'
from 
(select row_number() over(partition by cdate order by cardtime) rn,* from CardList) a 
inner join WorkDate b on a.emp=b.emp and a.cdate=b.cdate
inner join BANCI c on b.banci=c.code and a.rn=c.item
where b.banci is not null 

emp                  cdate                ctype
-------------------- -------------------- ----------------------------
YXX0004              2011-08-01           上午上班: 正常
YXX0004              2011-08-01           上午下班: 正常
YXX0004              2011-08-01           下午上班: 正常
YXX0004              2011-08-01           下午下班: 正常
YXX0004              2011-08-02           上午上班: 正常
YXX0004              2011-08-02           上午下班: 正常
YXX0004              2011-08-02           下午上班: 正常
YXX0004              2011-08-03           上午上班: 正常
YXX0004              2011-08-03           上午下班: 正常
YXX0004              2011-08-03           下午上班: 正常
YXX0004              2011-08-03           下午下班: 正常
YXX0004              2011-08-04           上午上班: 正常
YXX0004              2011-08-04           上午下班: 正常
YXX0004              2011-08-04           下午上班: 正常
YXX0004              2011-08-04           下午下班: 正常
YXX0004              2011-08-05           上午上班: 正常
YXX0004              2011-08-05           上午下班: 正常
YXX0004              2011-08-05           下午上班: 正常
YXX0004              2011-08-05           下午下班: 正常
YXX0004              2011-08-07           上午上班: 正常
YXX0004              2011-08-07           上午下班: 正常
YXX0004              2011-08-07           下午上班: 未刷卡
YXX0004              2011-08-07           下午下班: 正常
YXX0004              2011-08-08           上午上班: 正常
YXX0004              2011-08-08           上午下班: 正常
YXX0004              2011-08-08           下午上班: 正常
YXX0004              2011-08-08           下午下班: 正常
YXX0004              2011-08-09           上午上班: 正常
YXX0004              2011-08-09           上午下班: 正常
YXX0004              2011-08-09           下午上班: 正常
YXX0004              2011-08-09           下午下班: 正常
YXX0004              2011-08-10           上午上班: 正常
YXX0004              2011-08-10           上午下班: 正常
YXX0004              2011-08-10           下午上班: 正常
YXX0004              2011-08-10           下午下班: 正常
YXX0004              2011-08-11           上午上班: 正常
YXX0004              2011-08-11           上午下班: 正常
YXX0004              2011-08-11           下午上班: 正常
YXX0004              2011-08-11           下午下班: 正常
YXX0004              2011-08-12           上午上班: 正常
YXX0004              2011-08-12           上午下班: 正常
YXX0004              2011-08-12           下午上班: 正常
YXX0004              2011-08-12           下午下班: 正常
YXX0004              2011-08-14           上午上班: 正常
YXX0004              2011-08-14           上午下班: 正常
YXX0004              2011-08-14           下午上班: 未刷卡
YXX0004              2011-08-14           下午下班: 正常
YXX0004              2011-08-15           上午上班: 正常
YXX0004              2011-08-15           上午下班: 正常
YXX0004              2011-08-15           下午上班: 正常
YXX0004              2011-08-15           下午下班: 正常
YXX0004              2011-08-16           上午上班: 正常
YXX0004              2011-08-16           上午下班: 正常
YXX0004              2011-08-16           下午上班: 正常
YXX0004              2011-08-16           下午下班: 正常
YXX0004              2011-08-17           上午上班: 正常
YXX0004              2011-08-17           上午下班: 正常
YXX0004              2011-08-17           下午上班: 未刷卡
YXX0004              2011-08-18           上午上班: 正常
YXX0004              2011-08-18           上午下班: 正常
YXX0004              2011-08-18           下午上班: 正常
YXX0004              2011-08-18           下午下班: 正常
YXX0004              2011-08-19           上午上班: 正常
YXX0004              2011-08-19           上午下班: 正常
YXX0004              2011-08-19           下午上班: 正常
YXX0004              2011-08-19           下午下班: 正常
YXX0004              2011-08-21           上午上班: 正常
YXX0004              2011-08-21           上午下班: 正常
YXX0004              2011-08-21           下午上班: 未刷卡
YXX0004              2011-08-21           下午下班: 正常
YXX0004              2011-08-22           上午上班: 正常
YXX0004              2011-08-22           上午下班: 正常
YXX0004              2011-08-22           下午上班: 正常
YXX0004              2011-08-22           下午下班: 正常
YXX0004              2011-08-23           上午上班: 正常
YXX0004              2011-08-23           上午下班: 正常
YXX0004              2011-08-23           下午上班: 正常
YXX0004              2011-08-23           下午下班: 正常
YXX0004              2011-08-24           上午上班: 正常
YXX0004              2011-08-24           上午下班: 正常
YXX0004              2011-08-24           下午上班: 正常
YXX0004              2011-08-24           下午下班: 正常
YXX0004              2011-08-25           上午上班: 正常
YXX0004              2011-08-25           上午下班: 正常
YXX0004              2011-08-25           下午上班: 正常
YXX0004              2011-08-25           下午下班: 正常
YXX0004              2011-08-26           上午上班: 正常
YXX0004              2011-08-26           上午下班: 正常
YXX0004              2011-08-26           下午上班: 正常
YXX0004              2011-08-26           下午下班: 正常
YXX0004              2011-08-28           上午上班: 正常
YXX0004              2011-08-28           上午下班: 正常
YXX0004              2011-08-28           下午上班: 未刷卡
YXX0004              2011-08-29           上午上班: 正常
YXX0004              2011-08-29           上午下班: 正常
YXX0004              2011-08-29           下午上班: 正常
YXX0004              2011-08-29           下午下班: 正常
YXX0004              2011-08-30           上午上班: 正常
YXX0004              2011-08-30           上午下班: 正常
YXX0004              2011-08-30           下午上班: 正常
YXX0004              2011-08-30           下午下班: 正常
YXX0004              2011-08-31           上午上班: 正常
YXX0004              2011-08-31           上午下班: 正常
YXX0004              2011-08-31           下午上班: 正常
YXX0004              2011-08-31           下午下班: 正常

#14



select a.emp,b.cdate,c.ctype+': '+
case 
when cast(a.cardtime as datetime) between cast(c.KSTA as datetime) and cast(c.KLST as datetime) then '正常'
when cast(a.cardtime as datetime)>cast(c.KLST as datetime) then '迟到'
when cast(a.cardtime as datetime)<cast(c.KSTA as datetime) then '早退'
else '未打卡' end 'ctype'
from 
(select row_number() over(partition by cdate order by cardtime) rn,* from CardList) a 
inner join WorkDate b on a.emp=b.emp and a.cdate=b.cdate
inner join BANCI c on b.banci=c.code and a.rn=c.item
where b.banci is not null 

emp                  cdate                ctype
-------------------- -------------------- ----------------------------
YXX0004              2011-08-01           上午上班: 正常
YXX0004              2011-08-01           上午下班: 正常
YXX0004              2011-08-01           下午上班: 正常
YXX0004              2011-08-01           下午下班: 正常
YXX0004              2011-08-02           上午上班: 正常
YXX0004              2011-08-02           上午下班: 正常
YXX0004              2011-08-02           下午上班: 正常
YXX0004              2011-08-03           上午上班: 正常
YXX0004              2011-08-03           上午下班: 正常
YXX0004              2011-08-03           下午上班: 正常
YXX0004              2011-08-03           下午下班: 正常
YXX0004              2011-08-04           上午上班: 正常
YXX0004              2011-08-04           上午下班: 正常
YXX0004              2011-08-04           下午上班: 正常
YXX0004              2011-08-04           下午下班: 正常
YXX0004              2011-08-05           上午上班: 正常
YXX0004              2011-08-05           上午下班: 正常
YXX0004              2011-08-05           下午上班: 正常
YXX0004              2011-08-05           下午下班: 正常
YXX0004              2011-08-07           上午上班: 正常
YXX0004              2011-08-07           上午下班: 正常
YXX0004              2011-08-07           下午上班: 早退
YXX0004              2011-08-07           下午下班: 正常
YXX0004              2011-08-08           上午上班: 正常
YXX0004              2011-08-08           上午下班: 正常
YXX0004              2011-08-08           下午上班: 正常
YXX0004              2011-08-08           下午下班: 正常
YXX0004              2011-08-09           上午上班: 正常
YXX0004              2011-08-09           上午下班: 正常
YXX0004              2011-08-09           下午上班: 正常
YXX0004              2011-08-09           下午下班: 正常
YXX0004              2011-08-10           上午上班: 正常
YXX0004              2011-08-10           上午下班: 正常
YXX0004              2011-08-10           下午上班: 正常
YXX0004              2011-08-10           下午下班: 正常
YXX0004              2011-08-11           上午上班: 正常
YXX0004              2011-08-11           上午下班: 正常
YXX0004              2011-08-11           下午上班: 正常
YXX0004              2011-08-11           下午下班: 正常
YXX0004              2011-08-12           上午上班: 正常
YXX0004              2011-08-12           上午下班: 正常
YXX0004              2011-08-12           下午上班: 正常
YXX0004              2011-08-12           下午下班: 正常
YXX0004              2011-08-14           上午上班: 正常
YXX0004              2011-08-14           上午下班: 正常
YXX0004              2011-08-14           下午上班: 早退
YXX0004              2011-08-14           下午下班: 正常
YXX0004              2011-08-15           上午上班: 正常
YXX0004              2011-08-15           上午下班: 正常
YXX0004              2011-08-15           下午上班: 正常
YXX0004              2011-08-15           下午下班: 正常
YXX0004              2011-08-16           上午上班: 正常
YXX0004              2011-08-16           上午下班: 正常
YXX0004              2011-08-16           下午上班: 正常
YXX0004              2011-08-16           下午下班: 正常
YXX0004              2011-08-17           上午上班: 正常
YXX0004              2011-08-17           上午下班: 正常
YXX0004              2011-08-17           下午上班: 迟到
YXX0004              2011-08-18           上午上班: 正常
YXX0004              2011-08-18           上午下班: 正常
YXX0004              2011-08-18           下午上班: 正常
YXX0004              2011-08-18           下午下班: 正常
YXX0004              2011-08-19           上午上班: 正常
YXX0004              2011-08-19           上午下班: 正常
YXX0004              2011-08-19           下午上班: 正常
YXX0004              2011-08-19           下午下班: 正常
YXX0004              2011-08-21           上午上班: 正常
YXX0004              2011-08-21           上午下班: 正常
YXX0004              2011-08-21           下午上班: 早退
YXX0004              2011-08-21           下午下班: 正常
YXX0004              2011-08-22           上午上班: 正常
YXX0004              2011-08-22           上午下班: 正常
YXX0004              2011-08-22           下午上班: 正常
YXX0004              2011-08-22           下午下班: 正常
YXX0004              2011-08-23           上午上班: 正常
YXX0004              2011-08-23           上午下班: 正常
YXX0004              2011-08-23           下午上班: 正常
YXX0004              2011-08-23           下午下班: 正常
YXX0004              2011-08-24           上午上班: 正常
YXX0004              2011-08-24           上午下班: 正常
YXX0004              2011-08-24           下午上班: 正常
YXX0004              2011-08-24           下午下班: 正常
YXX0004              2011-08-25           上午上班: 正常
YXX0004              2011-08-25           上午下班: 正常
YXX0004              2011-08-25           下午上班: 正常
YXX0004              2011-08-25           下午下班: 正常
YXX0004              2011-08-26           上午上班: 正常
YXX0004              2011-08-26           上午下班: 正常
YXX0004              2011-08-26           下午上班: 正常
YXX0004              2011-08-26           下午下班: 正常
YXX0004              2011-08-28           上午上班: 正常
YXX0004              2011-08-28           上午下班: 正常
YXX0004              2011-08-28           下午上班: 迟到
YXX0004              2011-08-29           上午上班: 正常
YXX0004              2011-08-29           上午下班: 正常
YXX0004              2011-08-29           下午上班: 正常
YXX0004              2011-08-29           下午下班: 正常
YXX0004              2011-08-30           上午上班: 正常
YXX0004              2011-08-30           上午下班: 正常
YXX0004              2011-08-30           下午上班: 正常
YXX0004              2011-08-30           下午下班: 正常
YXX0004              2011-08-31           上午上班: 正常
YXX0004              2011-08-31           上午下班: 正常
YXX0004              2011-08-31           下午上班: 正常
YXX0004              2011-08-31           下午下班: 正常

#15


引用 14 楼 ap0405140 的回复:
SQL code


select a.emp,b.cdate,c.ctype+': '+
case 
when cast(a.cardtime as datetime) between cast(c.KSTA as datetime) and cast(c.KLST as datetime) then '正常'
when cast(a.cardtime as datetime)>ca……


8-2和8-17都有一次未打卡

#16


USE tempdb
go
WITH a
AS
(
SELECT 
a.[Emp],
a.[Banci],
a.CDate,
-- b.[KSTA] AS [KSTA],
-- c.CardTime,
打卡状态=case when CAST(c.[CardTime] AS DATETIME)<=[KTIME] and right(b.Ctype,2)=N'上班' then N'正常'
when CAST(c.[CardTime] AS DATETIME)>[KTIME] and right(b.Ctype,2)=N'上班' then N'迟到'
when CAST(c.[CardTime] AS DATETIME)>=[KTIME] and right(b.Ctype,2)=N'下班' then N'正常'
when CAST(c.[CardTime] AS DATETIME)<[KTIME] and right(b.Ctype,2)=N'下班' then N'早退'
else N'未打卡' end,
b.Ctype
FROM [WorkDate] AS a
INNER JOIN [BANCI] AS b ON a.[Banci]=b.[Code]
LEFT  JOIN [CardList] AS c ON c.Emp=a.Emp AND c.CDate=a.CDate AND CAST(c.[CardTime] AS DATETIME) BETWEEN b.[KSTA] AND b.[KLST]
)
SELECT 
*
FROM a
PIVOT (MAX(打卡状态) FOR Ctype IN(上午上班,上午下班,下午上班,下午下班,加班上班,加班下班)) AS b 


/*
Emp Banci CDate 上午上班 上午下班 下午上班 下午下班 加班上班 加班下班
YXX0004 10 2011-08-01 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-02 迟到 正常 正常 未打卡 未打卡 未打卡
YXX0004 10 2011-08-03 迟到 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-04 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-05 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-07 迟到 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-08 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-09 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-10 迟到 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-11 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-12 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-14 正常 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-15 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-16 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-17 迟到 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-18 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-19 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-21 正常 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-22 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-23 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-24 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-25 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-26 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-28 正常 正常 未打卡 正常 未打卡 未打卡
YXX0004 10 2011-08-29 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-30 正常 正常 正常 正常 未打卡 未打卡
YXX0004 10 2011-08-31 正常 正常 正常 正常 未打卡 未打卡
*/

#17


谢谢大版啊,太厉害了

#18


楼主这个问题,其实可以在考勤机里面做标识.就行了.没必要这样写

#19


引用 18 楼 chirea 的回复:
楼主这个问题,其实可以在考勤机里面做标识.就行了.没必要这样写


一般考勤机只有刷卡,没有其它按键来标识上班、下班的。

#20



同维考勤软件将考勤机的数据接收后,人事系统中的考勤数据接收将考勤记录接收保存到数据服务器的Personnel\data\Bak\ZDATA.DBF数据表中,然后将RECORD.DAT文件按时间备份后再删除,以免重复接收。对于ZDATA.DBF数据表,如果不考虑数据量的问题,可以一直存入此文件中,也可以通过手工备份的方法,按年份将数据备份出来(数据备份截至到每年的12.25)。
 员工每日排班,存放于YGPB.DBF数据表中,
其中需要每日排班的部门是:部门编号前两位为:'22','42','43','44','51','52','46','62',需要排班部门员工必须每日排班,公休日或休息也必须排班(休息)。
其他不需要排班部门的员工,可以手工排班,也可以由电脑自动生成(在考勤分析当天上班信息时,如果为非排班部门的员工且没有排班信息,也不是公休日,则自动添加一条排班记录(日班))。
 请假数据:QJYD.DBF
 公出公差:GCYD.DBF
 加班数据:JBYD.DBF
 公休日 :GGJR.DBF
 忘刷卡 :WSK.DBF
 考勤刷卡数据:ZDATA.DBF
二、 具体处理
1. 可以分析处理某一区间段的考勤数据(不要跨月分析)。
2. 将区间的考勤数据提取到临时文件中,考虑到夜班的问题,提取时,将多取前一天及后一天的考勤刷卡数据。
3. 在分析第一天数据时,会自动删除前一天夜班、加班下班准点2小时内的刷卡数据,以取得正确的上班刷卡记录。(如排班为8:00—00:00,且加班00:00-02:00,则会将4:00以前的刷卡数据删除) (如排班为8:00—23:30,则会将1:30以前的刷卡数据删除),以此类推。
4. 考虑到某一员工存在多次刷卡问题,在分析数据时,对于10分钟内有n次刷卡记录的,只保存最后一次刷卡记录。
5. 对于当月到职员工,只从到职日开始分析处理,且当天上班不算忘记刷卡。
6. 对于当月离职员工,只分析到离职日为止,且当天下班不算忘记刷卡。
7. 由于驾驶员的特殊情况,所以驾驶员所有考勤设为正常。
8. 在考勤分析当天上班信息时,如果为非排班部门的员工且没有排班信息,也不是公休日,则自动添加一条日班的排班记录。
9. 对于当天没有收到考勤数据的,不作分析处理。
10. 所有分析都是基于人事基础档(RSRY)中的是否刷卡标志(lskf),仅当需要刷卡时才进行数据分析。
处理流程详见\\Ntserver2\sccpcdata$\Personnel\data\考勤分析处理.vsd


[img=http://b77.photo.store.qq.com/psb?/V12oA7pv2OuJDK/ioAhiTV4xadxeNNEo99wxBQY36npIGcLgYrLOFox1ps!/b/YTBZ6C0BlAAAYpMA8y2enQAA][/img]

http://b83.photo.store.qq.com/psb?/V12oA7pv2OuJDK/91Thgnqcs*1TFHSmRzxJGq3Hrnm6Q.OptvFXc9R5atc!/b/YciijDEwGwAAYpxnfTG7GwAA

[img=http://b77.photo.store.qq.com/psb?/V12oA7pv2OuJDK/MUO3hNjwt1NKrdRaja6PSE6LYLOvrO3HpiGV9gzmGdc!/b/YTwG8y2gngAAYkya9y2VnwAA][/img]

#21


算了,自己到这个地方看图片吧

http://user.qzone.qq.com/628315/infocenter#!app=4

#22


谢谢大家

#23


depno    Emp                  CardNo               CDate                上午上班                 状态                   上午下班                 状态                   下午上班                 状态                   下午下班                 状态                   加班上班                 状态                   加班下班                 状态
----------------------------------------------------------------------------------------------------------------------------------------------------------------
0417 YXX0004 080801 2011-10-03 08:01 12:03 12:15 17:33
0417 YXX0004 080801 2011-10-04 07:56 12:03 12:21 19:45
0417 YXX0004 080801 2011-10-05 07:57 12:02 12:22 17:34
0417 YXX0004 080801 2011-10-06 请假 请假 请假 请假
0417 YXX0004 080801 2011-10-07 07:58 12:04 12:20 17:33
0417 YXX0004 080801 2011-10-09 07:57 未打卡 13:29 17:31
0417 YXX0004 080801 2011-10-10 08:00 12:05 12:19 17:34
0417 YXX0004 080801 2011-10-11 07:57 12:02 12:19 17:35
0417 YXX0004 080801 2011-10-12 07:59 12:03 12:17 17:32
0417 YXX0004 080801 2011-10-13 07:57 12:03 12:19 17:32
0417 YXX0004 080801 2011-10-14 07:29 12:03 12:18 17:33
0417 YXX0004 080801 2011-10-16 出差 出差 出差 出差
0417 YXX0004 080801 2011-10-17 出差 出差 出差 出差
0417 YXX0004 080801 2011-10-18 出差 出差 13:24 手工签卡 17:36 手工签卡
0417 YXX0004 080801 2011-10-19 07:55 手工签卡 12:06 手工签卡 未打卡 未打卡

#24


学习了

#25


这贴是谁结的?