一张表的数据如下
人员   日期(日期类型)
张三   00-01-01
张三   00-01-02
张三   00-01-03
张三   00-01-04
......
张三   00-01-31
......
张三   00-02-31
......
张三   00-12-31
不管一个月有多少天,我都按31天算,这样就能构成一张人员每天的记录,在联表查询时日期对比时,如何只判断月份与日期,联表查询完毕后在将日期加上年份。
结果如下
人员   日期       迟到时间
张三   2010-01-01     0
张三   2010-01-02    20
张三   2010-01-03    10
张三   2010-01-04     0
......
张三   2010-01-31     0
......
张三   2010-02-31    10
......
张三   2010-12-31    20其实就是昨天考勤问题的后续,继续跪求中

解决方案 »

  1.   


    select t1.人员,t2.日期,t2.迟到时间 from 人员日期表 t1
    left join 迟到表 t2
    on t1.人员=t2.人员
    and right(cast(t1.日期 as varchar),5)=right(cast(t2.日期 as varchar),5)
      

  2.   

    上面是如果迟到表只有一年的情况,如果多年呢?下面实现with cte as            --构造人员日期表中日期与迟到表中对应
    (select t1.人员,cast(t1.年+right(cast(t2.日期 as varchar),6) as date) as 新日期  from
    (select distinct 人员,left(cast(日期 as varchar),4) as 年 from 迟到表) t1  
    left join 人员日期表 t2 on t1.人员=t2.人员 )select t1.*,t2.迟到时间 from cte t1
    left join 迟到表 t2
    on t1.人员=t2.人员 and t1.新日期=t2.日期
      

  3.   


    --迟到表只有一年的情况
    select t1.人员,t2.日期,t2.迟到时间 from 人员日期表 t1
    left join 迟到表 t2
    on t1.人员=t2.人员
    and right(cast(t1.日期 as varchar),5)=right(cast(t2.日期 as varchar),5)
    --迟到表有多年的情况
    with cte as            --构造人员日期表中日期与迟到表中对应
    (select t1.人员,cast(t1.年+right(cast(t2.日期 as varchar),6) as date) as 新日期  from
    (select distinct 人员,left(cast(日期 as varchar),4) as 年 from 迟到表) t1  
    left join 人员日期表 t2 on t1.人员=t2.人员 )select t1.*,t2.迟到时间 from cte t1
    left join 迟到表 t2
    on t1.人员=t2.人员 and t1.新日期=t2.日期
      

  4.   

    OK了,用fpzgm的方法,不过咋说呢,交叉效率貌似又低了点儿,该死的客户提的鬼需求,该死的平台不能写代码!~
      

  5.   


    SELECT DISTINCT 姓名,编号,部门名称,SUBSTRING('[开始时间]',0,5)+SUBSTRING(DATE_TABLE.日期,5,6) as 日期 FROM KQ1 CROSS JOIN DATE_TABLE 
    WHERE SUBSTRING('[开始时间]',0,5)+SUBSTRING(DATE_TABLE.日期,5,6)>'[开始时间]' and SUBSTRING('[结束时间]',0,5)+SUBSTRING(DATE_TABLE.日期,5,6)<'[结束时间]'
    order by 姓名,编号这里我将DATE_TABLE中的日期字段改为了varchar,构造人员工作日期表是采用字符截取的方法,目前的缺点就是跨年的数据还没有办法处理,跨年的话只能分两次进行处理