我现在输入开始时间跟结束时间,需要计算出有效的工作时间
上午有效工作时间--08:30:00 到 11:45:00
下午有效工作时间--12:45:00 到 17:30:00
除了给出上午下午有效工作时间以外最好可以给出8小时外工作时间
也就是大于17:30:00的工作时间
请高手解答

解决方案 »

  1.   

    貌似和这个是一个意思!
    http://topic.csdn.net/u/20110802/12/bd95516e-0078-4657-a8a1-477b696f64c2.html
      

  2.   

    其实就是一堆case when...
    有几个问题问下LZ
    1.打卡时间是不是小鱼8点30就不算数的,也就是说,开始时间肯定大于8点30
    2.有迟到早退对吧
    3.晚上不会有过12点的吧
      

  3.   

    大致如下:
    select case when convert(varchar(8),开始时间,108) > '08:30:00' then datediff(mi,convert(varchar(8),开始时间,108),'11:45:00') else datediff(mi,'08:30:00','11:45:00') end +
           case when convert(varchar(8),结束时间,108) < '17:30:00' then datediff(mi,'12:45:00',convert(varchar(8),结束时间,108)) else datediff(mi,'12:45:00','17:30:00') end 有效工作时间,
           case when convert(varchar(8),结束时间,108) > '17:30:00' then datediff(mi,'17:30:00',convert(varchar(8),结束时间,108)) else 0 end [大于17:30:00的工作时间]
    from tb
      

  4.   

    我觉得加个sum是否好些?
    select 姓名,sum(case when convert(varchar(8),开始时间,108) > '08:30:00' then datediff(mi,convert(varchar(8),开始时间,108),'11:45:00') else datediff(mi,'08:30:00','11:45:00') end +
           case when convert(varchar(8),结束时间,108) < '17:30:00' then datediff(mi,'12:45:00',convert(varchar(8),结束时间,108)) else datediff(mi,'12:45:00','17:30:00') end) 有效工作时间,
           sum(case when convert(varchar(8),结束时间,108) > '17:30:00' then datediff(mi,'17:30:00',convert(varchar(8),结束时间,108)) else 0 end) [大于17:30:00的工作时间]
    from tb
    group by 姓名
      

  5.   

    create table tb(姓名 varchar(20),职位 varchar(20),开始时间 datetime,结束时间 datetime)
    insert into tb values('刘鸿飞'    ,'检查员', '2009-12-2 8:30', '2009-12-8 18:30')
    insert into tb values('张风苓'    ,'作业员', '2009-12-2 8:30', '2009-12-8 18:30')
    insert into tb values('何林林'    ,'作业员', '2009-12-2 8:30', '2009-12-8 18:30')
    insert into tb values('贺向峰'    ,'作业员', '2009-12-2 8:30', '2009-12-8 18:30')
    insert into tb values('黄文艳'    ,'作业员', '2009-12-2 8:30', '2009-12-8 18:30')
    insert into tb values('李静'      ,'作业员', '2009-12-2 8:30', '2009-12-8 18:30')
    goselect 姓名,sum(case when convert(varchar(8),开始时间,108) > '08:30:00' then datediff(mi,convert(varchar(8),开始时间,108),'11:45:00') else datediff(mi,'08:30:00','11:45:00') end +
           case when convert(varchar(8),结束时间,108) < '17:30:00' then datediff(mi,'12:45:00',convert(varchar(8),结束时间,108)) else datediff(mi,'12:45:00','17:30:00') end) 有效工作时间,
           sum(case when convert(varchar(8),结束时间,108) > '17:30:00' then datediff(mi,'17:30:00',convert(varchar(8),结束时间,108)) else 0 end) [大于17:30:00的工作时间]
    from tb
    group by 姓名
    drop table tb/*
    姓名                   有效工作时间      大于17:30:00的工作时间 
    -------------------- ----------- --------------- 
    何林林                  480         60
    贺向峰                  480         60
    黄文艳                  480         60
    李静                   480         60
    刘鸿飞                  480         60
    张风苓                  480         60(所影响的行数为 6 行)*/