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
  • 相关阅读:
    phome_enewsclass 数据表字段解释(栏目主表)
    phome_ecms_news 数据表字段解释(新闻系统模型-主表)
    帝国cms7.2灵动标签万能教程
    帝国cms7.2自定义列表建立tag效果 代码 教程
    栏目自定义变量怎么用?
    给你的网站404页面加上“宝贝寻亲”公益页面
    discuz_style_default.xml修改
    谈谈几大宗教.
    discuz默认模板文件结构详解-模板文件夹介绍
    一些适合用手柄玩的网络游戏
  • 原文地址:https://www.cnblogs.com/wghao/p/713443.html
Copyright © 2011-2022 走看看