--班次
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
我有看了,可是没看懂啊,大版
#9
原始数据有问题吧,Emp都是YXX0004,都是同一个人?
#10
呵呵,我现在只抓一个人来做测试的,数据没问题的
#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
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
一般考勤机只有刷卡,没有其它按键来标识上班、下班的。
#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
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 手工签卡 未打卡 未打卡
----------------------------------------------------------------------------------------------------------------------------------------------------------------
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
我有看了,可是没看懂啊,大版
#9
原始数据有问题吧,Emp都是YXX0004,都是同一个人?
#10
呵呵,我现在只抓一个人来做测试的,数据没问题的
#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
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
一般考勤机只有刷卡,没有其它按键来标识上班、下班的。
#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
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 手工签卡 未打卡 未打卡
----------------------------------------------------------------------------------------------------------------------------------------------------------------
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
这贴是谁结的?