这数据有问题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 怎么办 记录时间有问题 
表设计有我问题 我只是记录一个特殊的例子 

解决方案 »

  1.   

    你把ADDTIME    ENDTIME插入值为完整的日期格式不行吗  
      

  2.   

    员工编号  加班开始时间  加班结束时间    请假开始时间  请假结束时间    出差开始时间  出差结束时间 
    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   
                    
      

  3.   

    select personno,datediff(hour,addtime,endtime) as 加班时间,datediff(hour,lstardate ,lenddate) as 请假时间,datediff(day,ESTARTDATE,EENDDATE) as 出差天数
    from table
    group by personno
      

  4.   

    员工编号  加班开始时间  加班结束时间    请假开始时间  请假结束时间    出差开始时间  出差结束时间
    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  
      

  5.   

    我了解select  personno,datediff(hour,addtime,endtime) as 加班时间,datediff(hour,lstardate ,lenddate) as 请假时间,datediff(day,ESTARTDATE,EENDDATE) as 出差天数,但是我不会用SQL语句表达是统计的四月份,再加上大家给出的建议,现在还要考虑到加班跨天统计时间,这两个问题我解决不了!
      

  6.   

    select personno,datediff(hour,addtime,endtime) as 加班时间,datediff(hour,lstardate ,lenddate) as 请假时间,datediff(day,ESTARTDATE,EENDDATE) as 出差天数
    from table
    group by personno
      

  7.   

    ---测试数据---
    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 行)
    这样?
      

  8.   

    上面的不完全对,如果开始日期跨月份第一天,或是结束日期跨月份最后一天,这样算出来的就不是当月的天数了。
    要处理这个问题还挺烦吧,没想到好办法,只想到用开始、结束日期去跟当月的月初、月末分别比较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大概写了一下,不完整也未测试过,楼主看看加工一下吧。
      

  9.   

    补充一下,语句中那个'2009-4-1'和'2009-4-30'不一定是写死的,楼主通过程序处理好传过去也行,或者用SQL的格式转换处理也行。
      

  10.   

    我想求4月份的统计该怎么写SQL语句?
      

  11.   

    where datediff (month,2009-04-01,getdate() )=0   四月份