当前位置: 代码迷 >> Sql Server >> 求SQL 一段时间内没有记录的人员清单解决方案
  详细解决方案

求SQL 一段时间内没有记录的人员清单解决方案

热度:14   发布时间:2016-04-27 17:59:29.0
求SQL 一段时间内没有记录的人员清单
有一个员工表 Employee EmpGUID,Name 
有一个打卡记录表 Record RcdGUID,EmpGUID, RcdDate,RcdPlace

每一个员工上班,打卡后都会产生一条打卡记录在打卡记录表中。现在需要一个SQL语句,查询出在某一段时间内,没有打卡记录的员工名单+他没打卡的日期。

举例:如果张三在2011-10-26,2011-10-29,2011-10-31有打卡记录。
那么SQL语句得到的就是
2011-10-27 张三
2011-10-28 张三
2011-10-30 张三
...


------解决方案--------------------
先构建一个连续的日期表
然后再和这2个表关联,left join找出null的
------解决方案--------------------
SQL code
CREATE FUNCTION generateTimeV2    (      @begin_date DATETIME ,      @end_date DATETIME    )RETURNS @t TABLE ( date DATETIME )AS     BEGIN        INSERT  INTO @t                SELECT  DATEADD(dd, number, @begin_date) AS date                FROM    master..spt_values                WHERE   type = 'p'                        AND DATEADD(dd, number, @begin_date) <= @end_date        RETURN    ENDdeclare @T table (name varchar(14),date datetime)insert into @Tselect '张三','2011-10-26' union allselect '张三','2011-10-29' union allselect '张三','2011-10-31'SELECT  b.*FROM    @T a        RIGHT JOIN ( SELECT '张三' AS name ,                            *                     FROM   dbo.generateTimeV2(( SELECT MIN(date)                                                 FROM   @T                                                 WHERE  name = '张三'                                               ), ( SELECT  MAX(date)                                                    FROM    @T                                                    WHERE   name = '张三'                                                  ))                   ) b ON a.NAME = b.NAME                          AND a.date = b.dateWHERE   a.NAME IS NULL/*name date---- -----------------------张三   2011-10-27 00:00:00.000张三   2011-10-28 00:00:00.000张三   2011-10-30 00:00:00.000*/
  相关解决方案