首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-03-20 
求SQL 一段时间内没有记录的人员清单有一个员工表Employee EmpGUID,Name有一个打卡记录表 RecordRcdGUID,E

求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*/ 

热点排行