打卡处理


CREATE TABLE [dbo].[Hr](
 [部门] [nvarchar](255) NULL,
 [姓名] [nvarchar](255) NULL,
 [考勤号码] [nvarchar](255) NULL,
 [日期时间] [datetime] NULL,
 [日期] [datetime] NULL,
 [时间] [datetime] NULL,
 [记录状态] [nvarchar](255) NULL,
 [F8] [nvarchar](255) NULL,
 [机器号] [nvarchar](255) NULL,
 [编号] [nvarchar](255) NULL,
 [工种代码] [nvarchar](255) NULL,
 [比对方式] [nvarchar](255) NULL,
 [卡号] [nvarchar](255) NULL,
 [考勤] [nvarchar](255) NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[Hr_1](
 [姓名] [nvarchar](50) NULL,
 [考勤号码] [nvarchar](50) NULL,
 [日期时间] [datetime] NULL,
 [上班打卡_A] [datetime] NULL,
 [下班打卡_A] [datetime] NULL,
 [备注] [nvarchar](50) NULL,
 [上班打卡_P] [datetime] NULL,
 [下班打卡_P] [datetime] NULL,
 [上班打卡_E] [datetime] NULL,
 [下班打卡_E] [datetime] NULL,
 CONSTRAINT [Unique_Hr_1] UNIQUE NONCLUSTERED
(
 [考勤号码] ASC,
 [日期时间] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

-----------------------------------
ALTER  PROCEDURE [dbo].[Hr_addNewMonth]
as
BEGIN 
  INSERT INTO [Hr_1]
           ([日期时间],[姓名]
           ,[考勤号码])
  select distinct CONVERT(char(10),日期时间,120) as atime,姓名,考勤号码 from Hr a
  where (select COUNT(*) from [Hr_1] b where b.考勤号码 = a.考勤号码 and b.日期时间 = CONVERT(char(10),a.日期时间,120) ) < 1
  order by a.姓名,CONVERT(char(10),a.日期时间,120)
END
---------------------------
---上午上班打卡
ALTER PROCEDURE [dbo].[Hr_Update1]  
AS
DECLARE  @wkdatetime1 datetime   --时间
DECLARE  @wk_no varchar(20)      --工号
DECLARE  @wk_date datetime      --打卡日期
DECLARE  @wk_month varchar(20)   --打卡月份
DECLARE  @row_count int          --记录行数
BEGIN
    set @wk_month ='2015-01'     ---设置计算初值
 DECLARE cur_wkno_input CURSOR  FOR
         select distinct 考勤号码 from Hr_1  where CONVERT(char(7),日期时间,120) =@wk_month  
        
 
        
 OPEN cur_wkno_input 
    FETCH  cur_wkno_input INTO @wk_no
 WHILE @@FETCH_STATUS = 0
      BEGIN
          
                     
   -----按工号循环
         DECLARE cur_wk_date_input CURSOR  FOR         
         select 日期时间 from Hr_1 where CONVERT(char(7),日期时间,120) =@wk_month and 考勤号码 = @wk_no
        
        OPEN cur_wk_date_input 
     FETCH  cur_wk_date_input INTO @wk_date
     WHILE @@FETCH_STATUS = 0
     BEGIN   
     --select CONVERT(datetime,CONVERT(char(10),@wk_date,120) + ' 09:00:00',101);
     --select CONVERT(datetime,CONVERT(char(10),GETDATE(),120) + ' 09:00:00',101);         
     -----按日期循环
         set @row_count = 0
               SELECT @row_count = count(*)  from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and 日期时间 < 
               CONVERT(datetime,@wk_date + ' 09:00:00',101)                
         if @row_count > 0                
            BEGIN 
               set @wkdatetime1 =  (select  top 1 日期时间   from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and 日期时间 < 
               CONVERT(datetime,@wk_date + ' 09:00:00',101)  order by 日期时间)              
               update [Hr_1] set 上班打卡_A = @wkdatetime1  where 考勤号码 = @wk_no and 日期时间 = @wk_date and 上班打卡_A is null             
              
            end
           -----按日期循环
           FETCH  cur_wk_date_input INTO @wk_date
     end 
     CLOSE cur_wk_date_input
     DEALLOCATE cur_wk_date_input  
  
   -----按工号循环
   FETCH  cur_wkno_input INTO @wk_no
   end 
   CLOSE cur_wkno_input
      DEALLOCATE cur_wkno_input
END

--------------------------
---上午下班打卡
ALTER  PROCEDURE [dbo].[hr_Update2]  
AS
DECLARE  @wkdatetime1 datetime   --时间
DECLARE  @wk_no varchar(20)      --工号
DECLARE  @wk_date datetime      --打卡日期
DECLARE  @wk_month varchar(20)   --打卡月份
DECLARE  @row_count int          --记录行数
BEGIN
    set @wk_month ='2015-01'     ---设置计算初值
 DECLARE cur_wkno_input CURSOR  FOR
         select distinct 考勤号码 from Hr_1  where CONVERT(char(7),日期时间,120) =@wk_month 
        
 OPEN cur_wkno_input 
    FETCH  cur_wkno_input INTO @wk_no
 WHILE @@FETCH_STATUS = 0
      BEGIN          
                     
   -----按工号循环
         DECLARE cur_wk_date_input CURSOR  FOR         
         select 日期时间 from Hr_1 where CONVERT(char(7),日期时间,120) =@wk_month and 考勤号码 = @wk_no
        
        OPEN cur_wk_date_input 
     FETCH  cur_wk_date_input INTO @wk_date
     WHILE @@FETCH_STATUS = 0
     BEGIN   
     --select CONVERT(datetime,CONVERT(char(10),@wk_date,120) + ' 09:00:00',101);
     --select CONVERT(datetime,CONVERT(char(10),GETDATE(),120) + ' 09:00:00',101);         
     -----按日期循环
         set @row_count = 0
               SELECT @row_count = count(*)  from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 11:30:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 14:10:00',101)               
         if @row_count > 0                
            BEGIN 
               set @wkdatetime1 =  (select  top 1 日期时间   from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 11:30:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 14:10:00',101)  order by 日期时间 ) 
                           
               update [Hr_1] set 下班打卡_A = @wkdatetime1  where 考勤号码 = @wk_no and 日期时间 = @wk_date and 下班打卡_A is null             
              
            end
           -----按日期循环
           FETCH  cur_wk_date_input INTO @wk_date
     end 
     CLOSE cur_wk_date_input
     DEALLOCATE cur_wk_date_input  
  
   -----按工号循环
   FETCH  cur_wkno_input INTO @wk_no
   end 
   CLOSE cur_wkno_input
      DEALLOCATE cur_wkno_input
END


-----------------------------
---下午上班打卡
ALTER  PROCEDURE [dbo].[hr_Update3] 
AS
DECLARE  @wkdatetime1 datetime   --时间
DECLARE  @wk_no varchar(20)      --工号
DECLARE  @wk_date datetime      --打卡日期
DECLARE  @wk_month varchar(20)   --打卡月份
DECLARE  @row_count int          --记录行数
BEGIN
    set @wk_month ='2015-01'     ---设置计算初值
 DECLARE cur_wkno_input CURSOR  FOR
         select distinct 考勤号码 from Hr_1  where CONVERT(char(7),日期时间,120) =@wk_month 
        
 OPEN cur_wkno_input 
    FETCH  cur_wkno_input INTO @wk_no
 WHILE @@FETCH_STATUS = 0
      BEGIN          
                     
   -----按工号循环
         DECLARE cur_wk_date_input CURSOR  FOR         
         select 日期时间 from Hr_1 where CONVERT(char(7),日期时间,120) =@wk_month and 考勤号码 = @wk_no
        
        OPEN cur_wk_date_input 
     FETCH  cur_wk_date_input INTO @wk_date
     WHILE @@FETCH_STATUS = 0
     BEGIN   
     --select CONVERT(datetime,CONVERT(char(10),@wk_date,120) + ' 09:00:00',101);
     --select CONVERT(datetime,CONVERT(char(10),GETDATE(),120) + ' 09:00:00',101);         
     -----按日期循环
         set @row_count = 0
               SELECT @row_count = count(*)  from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 11:30:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 14:10:00',101)               
         if @row_count > 0                
            BEGIN 
               set @wkdatetime1 =  (select  top 1 日期时间   from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 11:30:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 14:10:00',101)  order by 日期时间 desc) 
                           
               update [Hr_1] set 上班打卡_P = @wkdatetime1  where 考勤号码 = @wk_no and 日期时间 = @wk_date and 上班打卡_P is null             
              
            end
           -----按日期循环
           FETCH  cur_wk_date_input INTO @wk_date
     end 
     CLOSE cur_wk_date_input
     DEALLOCATE cur_wk_date_input  
  
   -----按工号循环
   FETCH  cur_wkno_input INTO @wk_no
   end 
   CLOSE cur_wkno_input
      DEALLOCATE cur_wkno_input
END
--------------------------
---下午下班打卡
ALTER  PROCEDURE [dbo].[hr_Update4]  
AS
DECLARE  @wkdatetime1 datetime   --时间
DECLARE  @wk_no varchar(20)      --工号
DECLARE  @wk_date datetime      --打卡日期
DECLARE  @wk_month varchar(20)   --打卡月份
DECLARE  @row_count int          --记录行数
BEGIN
    set @wk_month ='2015-01'     ---设置计算初值
 DECLARE cur_wkno_input CURSOR  FOR
         select distinct 考勤号码 from Hr_1  where CONVERT(char(7),日期时间,120) =@wk_month 
        
 OPEN cur_wkno_input 
    FETCH  cur_wkno_input INTO @wk_no
 WHILE @@FETCH_STATUS = 0
      BEGIN          
                     
   -----按工号循环
         DECLARE cur_wk_date_input CURSOR  FOR         
         select 日期时间 from Hr_1 where CONVERT(char(7),日期时间,120) =@wk_month and 考勤号码 = @wk_no
        
        OPEN cur_wk_date_input 
     FETCH  cur_wk_date_input INTO @wk_date
     WHILE @@FETCH_STATUS = 0
     BEGIN   
     --select CONVERT(datetime,CONVERT(char(10),@wk_date,120) + ' 09:00:00',101);
     --select CONVERT(datetime,CONVERT(char(10),GETDATE(),120) + ' 09:00:00',101);         
     -----按日期循环
         set @row_count = 0
               SELECT @row_count = count(*)  from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 17:00:00',101)                
         if @row_count > 0                
            BEGIN 
               set @wkdatetime1 =  (select  top 1 日期时间   from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 17:00:00',101)  order by 日期时间 desc)              
               update [Hr_1] set 下班打卡_P = @wkdatetime1  where 考勤号码 = @wk_no and 日期时间 = @wk_date and 下班打卡_P is null             
              
            end
           -----按日期循环
           FETCH  cur_wk_date_input INTO @wk_date
     end 
     CLOSE cur_wk_date_input
     DEALLOCATE cur_wk_date_input  
  
   -----按工号循环
   FETCH  cur_wkno_input INTO @wk_no
   end 
   CLOSE cur_wkno_input
      DEALLOCATE cur_wkno_input
END


-----------------------
---晚上上班打卡
ALTER  PROCEDURE [dbo].[hr_Update5] 
AS
DECLARE  @wkdatetime1 datetime   --时间
DECLARE  @wk_no varchar(20)      --工号
DECLARE  @wk_date datetime      --打卡日期
DECLARE  @wk_month varchar(20)   --打卡月份
DECLARE  @row_count int          --记录行数
BEGIN
    set @wk_month ='2015-01'     ---设置计算初值
 DECLARE cur_wkno_input CURSOR  FOR
         select distinct 考勤号码 from Hr_1  where CONVERT(char(7),日期时间,120) =@wk_month 
        
 OPEN cur_wkno_input 
    FETCH  cur_wkno_input INTO @wk_no
 WHILE @@FETCH_STATUS = 0
      BEGIN          
                     
   -----按工号循环
         DECLARE cur_wk_date_input CURSOR  FOR         
         select 日期时间 from Hr_1 where CONVERT(char(7),日期时间,120) =@wk_month and 考勤号码 = @wk_no
        
        OPEN cur_wk_date_input 
     FETCH  cur_wk_date_input INTO @wk_date
     WHILE @@FETCH_STATUS = 0
     BEGIN   
     --select CONVERT(datetime,CONVERT(char(10),@wk_date,120) + ' 09:00:00',101);
     --select CONVERT(datetime,CONVERT(char(10),GETDATE(),120) + ' 09:00:00',101);         
     -----按日期循环
         set @row_count = 0
               SELECT @row_count = count(*)  from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 18:00:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 23:50:00',101) and 部门
               not in ('研发部','软件部','人力资源','财务中心','采购中心','市场部','工程部','总公司','总经办','销售公司')                           
         if @row_count > 0                
            BEGIN 
               set @wkdatetime1 =  (select  top 1 日期时间   from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 18:00:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 23:50:00',101)
               and 部门
               not in ('研发部','软件部','人力资源','财务中心','采购中心','市场部','工程部','总公司','总经办','销售公司')  order by 日期时间) 
                           
               update [Hr_1] set 上班打卡_E = @wkdatetime1  where 考勤号码 = @wk_no and 日期时间 = @wk_date and 上班打卡_E is null             
              
            end
           -----按日期循环
           FETCH  cur_wk_date_input INTO @wk_date
     end 
     CLOSE cur_wk_date_input
     DEALLOCATE cur_wk_date_input  
  
   -----按工号循环
   FETCH  cur_wkno_input INTO @wk_no
   end 
   CLOSE cur_wkno_input
      DEALLOCATE cur_wkno_input
END

-----------------------
---晚上下班打卡
ALTER  PROCEDURE [dbo].[hr_Update6] 
AS
DECLARE  @wkdatetime1 datetime   --时间
DECLARE  @wk_no varchar(20)      --工号
DECLARE  @wk_date datetime      --打卡日期
DECLARE  @wk_month varchar(20)   --打卡月份
DECLARE  @row_count int          --记录行数
BEGIN
    set @wk_month ='2015-01'     ---设置计算初值
 DECLARE cur_wkno_input CURSOR  FOR
         select distinct 考勤号码 from Hr_1  where CONVERT(char(7),日期时间,120) =@wk_month 
        
 OPEN cur_wkno_input 
    FETCH  cur_wkno_input INTO @wk_no
 WHILE @@FETCH_STATUS = 0
      BEGIN          
                     
   -----按工号循环
         DECLARE cur_wk_date_input CURSOR  FOR         
         select 日期时间 from Hr_1 where CONVERT(char(7),日期时间,120) =@wk_month and 考勤号码 = @wk_no
        
        OPEN cur_wk_date_input 
     FETCH  cur_wk_date_input INTO @wk_date
     WHILE @@FETCH_STATUS = 0
     BEGIN   
     --select CONVERT(datetime,CONVERT(char(10),@wk_date,120) + ' 09:00:00',101);
     --select CONVERT(datetime,CONVERT(char(10),GETDATE(),120) + ' 09:00:00',101);         
     -----按日期循环
         set @row_count = 0
               SELECT @row_count = count(*)  from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 18:00:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 23:50:00',101) and 部门
               not in ('研发部','软件部','人力资源','财务中心','采购中心','市场部','工程部','总公司','总经办','销售公司')               
         if @row_count > 0                
            BEGIN 
               set @wkdatetime1 =  (select  top 1 日期时间   from Hr where 考勤号码 = @wk_no and CONVERT(char(10),日期时间,120) =  CONVERT(char(10),@wk_date,120)   and
               日期时间 >  CONVERT(datetime,@wk_date + ' 18:00:00',101)  and 日期时间 <  CONVERT(datetime,@wk_date + ' 23:50:00',101)
               and 部门
               not in ('研发部','软件部','人力资源','财务中心','采购中心','市场部','工程部','总公司','总经办','销售公司')
               order by 日期时间 desc)                             
               update [Hr_1] set 下班打卡_E = @wkdatetime1  where 考勤号码 = @wk_no and 日期时间 = @wk_date and 下班打卡_E is null                  
              
            end
           -----按日期循环
           FETCH  cur_wk_date_input INTO @wk_date
     end 
     CLOSE cur_wk_date_input
     DEALLOCATE cur_wk_date_input  
  
   -----按工号循环
   FETCH  cur_wkno_input INTO @wk_no
   end 
   CLOSE cur_wkno_input
      DEALLOCATE cur_wkno_input
END

原文地址:https://www.cnblogs.com/szlixin/p/4313269.html