这数据有问题PERSONNO ADDTIME ENDTIME WORKDATE LSTARDATE LENDDATE ESTARTDATE EENDDATE
1001 17:30:00 18:30:00 2009-04-30 NULL NULL NULL NULL
ADDTIME ENDTIME 怎么只有时间 如果我是通宵怎么办 17:30:00 00:30:00 如果是星期5加班一直到星期6的晚上6.30 怎么办 记录时间有问题
表设计有我问题 我只是记录一个特殊的例子
1001 17:30:00 18:30:00 2009-04-30 NULL NULL NULL NULL
ADDTIME ENDTIME 怎么只有时间 如果我是通宵怎么办 17:30:00 00:30:00 如果是星期5加班一直到星期6的晚上6.30 怎么办 记录时间有问题
表设计有我问题 我只是记录一个特殊的例子
PERSONNO ADDTIME ENDTIME LSTARDATE LENDDATE ESTARTDATE EENDDATE
1001 2009-04-30 2009-04-30 NULL NULL NULL NULL
17:30:00 18:30:00
1001 NULL NULL 2009-04-15 2009-04-17 NULL NULL
08:00:00 17:30:00
1002 NULL NULL 2009-04-20 2009-04-21 NULL NULL
08:00:00 17:30:00
1003 NULL NULL NULL NULL 2009-04-15 2009-04-17
1004 NULL NULL NULL NULL 2009-03-1 2009-03-5
1004 2009-04-28 2009-04-29 NULL NULL NULL NULL
19:00:00 1:30:00
from table
group by personno
PERSONNO ADDTIME ENDTIME LSTARDATE LENDDATE ESTARTDATE EENDDATE
1001 2009-04-30 2009-04-30 NULL NULL NULL NULL
17:30:00 18:30:00
1001 NULL NULL 2009-04-15 2009-04-17 NULL NULL
08:00:00 17:30:00
1002 NULL NULL 2009-04-20 2009-04-21 NULL NULL
08:00:00 17:30:00
1003 NULL NULL NULL NULL 2009-04-15 2009-04-17
1004 NULL NULL NULL NULL 2009-03-1 2009-03-5
1004 2009-04-28 2009-04-29 NULL NULL NULL NULL
19:00:00 1:30:00
from table
group by personno
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([PERSONNO] int,[ADDTIME] datetime,[ENDTIME] datetime,[LSTARDATE] datetime,[LENDDATE] datetime,[ESTARTDATE] datetime,[EENDDATE] datetime)
insert [tb]
select 1001,'2009-04-30 17:30:00','2009-04-30 18:30:00',null,null,null,null union all
select 1001,null,null,'2009-04-15 08:00:00','2009-04-17 17:30:00',null,null union all
select 1002,null,null,'2009-04-20 08:00:00','2009-04-21 17:30:00',null,null union all
select 1003,null,null,null,null,'2009-04-15','2009-04-17' union all
select 1004,null,null,null,null,'2009-03-1','2009-03-5' union all
select 1004,'2009-04-28 19:00:00','2009-04-29 1:30:00',null,null,null,null
---查询---
select
a.PERSONNO,
[加班时间(小时)]=isnull(sum(datediff(hh,b.ADDTIME,b.ENDTIME)),0),
[请假时间(小时)]=isnull(sum(datediff(hh,c.LSTARDATE,c.LENDDATE)),0),
[出差天数(天)]=isnull(sum(datediff(dd,d.ESTARTDATE,d.EENDDATE)),0)
from
(select distinct PERSONNO from tb) a
left join
(select PERSONNO,ADDTIME,ENDTIME from tb) b on a.PERSONNO=b.PERSONNO
left join
(select PERSONNO,LSTARDATE,LENDDATE from tb) c on a.PERSONNO=c.PERSONNO
left join
(select PERSONNO,ESTARTDATE,EENDDATE from tb) d on a.PERSONNO=d.PERSONNO
group by
a.PERSONNO
---结果---
PERSONNO 加班时间(小时) 请假时间(小时) 出差天数(天)
----------- ----------- ----------- -----------
1001 4 228 0
1002 0 33 0
1003 0 0 2
1004 24 0 16(所影响的行数为 4 行)
这样?
要处理这个问题还挺烦吧,没想到好办法,只想到用开始、结束日期去跟当月的月初、月末分别比较select
personno,
dateadiff(dd,case when ESTARTDATE>='2009-4-1' then ESTARTDATE else '2009-4-1' end,
case when EENDDATE<='2009-4-30 then EENDDATE else '2009-4-30' end) as 出差天数
from ATTENDANCE
where ESTARTDATE<='2009-4-30' and EENDDATE>='2009-4-1'
group by personno大概写了一下,不完整也未测试过,楼主看看加工一下吧。