zoukankan      html  css  js  c++  java
  • 按某一段时间,自动生成员工的打卡记录

    好久没上bbs.54master了。有一朋友问了一条有关通过SQL语句自动生成打卡问题。

    原问题:姓名  第一次打卡时间   第二次打卡时间  日期
    A          8:01                        17:01                    07-01-01
    B          8:04                        17:02                    07-01-01
    A          8:03                        17:07                    07-01-02
    .............

    我要做一份假的考勤记录,需批量更新考勤打卡时间, 如果我需要更改07年1月份的所有人员第一,
    二次打卡时间,且产生虚似随机的一个打卡时间,第一次打卡时间范围为8:00~8:10 第二次时间范围为17:00~17:10之间

    /*
    功能:按某一段时间,自动生成员工的打卡记录
    设计:OK_008(wgh)
    时间:2007-04-14
    */
    --人事表
    CREATE TABLE #Employee(EmployeeID int,ChineseName nvarchar(20))
    --考勤表
    CREATE TABLE #OnOffDuty(EmployeeID int,Check1 datetime,Check2 datetime,CheckDate datetime)
    --虚拟人事信息
    INSERT INTO #Employee
    SELECT 1,'张小名' UNION ALL
    SELECT 2,'黄大' UNION ALL
    SELECT 3,'李兵' UNION ALL
    SELECT 4,'刘达' UNION ALL
    SELECT 5,'张雷' UNION ALL
    SELECT 6,'郭小妹' 
    /*
    自动生成2007年1月份的考勤打卡时间
    方法:
        使用游标按员工再按日期生成打卡记录   
    */
    DECLARE @BeginDate datetime
    ,
    @EndDate datetime
    ,
    @CheckDate datetime
    ,
    @EmployeeID int
    ,
    @EXECUTE_SQL nvarchar(4000)
    ,
    @For int
    SELECT @BeginDate='2007-01-01',@EndDate='2007-01-31' ,@EXECUTE_SQL='',@For=0
    DECLARE CursorEmployee CURSOR FOR
    SELECT EmployeeID FROM #Employee 
    OPEN CursorEmployee
    FETCH NEXT FROM CursorEmployee INTO @EmployeeID
    WHILE @@FETCH_STATUS=0
    BEGIN
      
    SET @CheckDate=@BeginDate
      
    WHILE (@CheckDate<=@EndDate)
       
    BEGIN
        
    --根据实际调整RAND()的值范围
        SELECT @EXECUTE_SQL=@EXECUTE_SQL+'INSERT INTO #OnOffDuty SELECT '
         
    +CAST(@EmployeeID AS nvarchar(20))+','''
         
    + CONVERT(nchar(10),@CheckDate,121)+' 08:0'+SUBSTRING(CAST(RAND() AS nvarchar(20)),3,1)+''','''
         
    + CONVERT(nchar(10),@CheckDate,121)+' 17:0'+SUBSTRING(CAST(RAND() AS nvarchar(20)),3,1)+''','''
         
    + CONVERT(nchar(10),@CheckDate,121)+''''+CHAR(10)
         ,
    @For=@For+1
        
    IF (@For%40)=0  --每40行保存一次,根据实际的@EXECUTE_SQL长度来调试多少行。
         BEGIN
          
    EXECUTE (@EXECUTE_SQL)
          
    SET @EXECUTE_SQL=''
         
    END
        
    SET @CheckDate=DATEADD(day,1,@CheckDate)
       
    END
      
    FETCH NEXT FROM CursorEmployee INTO @EmployeeID
    END
    CLOSE CursorEmployee
    DEALLOCATE CursorEmployee
    IF(@EXECUTE_SQL<>''EXECUTE (@EXECUTE_SQL)  --判断@EXECUTE_SQL是否已经执行完成
    --
    查询结果:
    SELECT B.ChineseName,A.Check1,A.Check2,A.CheckDate FROM #OnOffDuty A 
    INNER JOIN  #Employee B ON B.EmployeeID=A.EmployeeID
    ORDER BY A.EmployeeID,A.CheckDate
    DROP TABLE #Employee,#OnOffDuty
  • 相关阅读:
    Apple Swift编程语言入门教程
    网络请求错误
    Mac使用大全
    MPMovieplayerController添加新控件
    ios9 新变化
    UITableView总结
    UINavigationController的简单学习
    HTML
    谓词(NSPredicate)
    NSString字符串
  • 原文地址:https://www.cnblogs.com/wghao/p/713443.html
Copyright © 2011-2022 走看看