日期:2014-05-18  浏览次数:20542 次

求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

    END


declare @T table (name varchar(14),date datetime)
insert into @T
select '张三','2011-10-26' union all
select '张三','2011-10-29' union all
select '张三','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.date
WHERE   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
*/