一张表的数据如下
人员 日期(日期类型)
张三 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其实就是昨天考勤问题的后续,继续跪求中
人员 日期(日期类型)
张三 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其实就是昨天考勤问题的后续,继续跪求中
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)
(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.日期
--迟到表只有一年的情况
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.日期
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,构造人员工作日期表是采用字符截取的方法,目前的缺点就是跨年的数据还没有办法处理,跨年的话只能分两次进行处理