人员编号  姓名      加班名称        刷卡日期          有效开始时间          实际开始时间       有效结束时间    
SKY00004  xx      周休加班 2011-01-02 2011-01-02 07:50 2011-01-02 07:50 2011-01-02 12:00
   实际结束时间    计划加班时长   实际加班时长    
2011-01-02 12:00 4       4SKY00004  xx 周休加班 2011-01-02 2011-01-02 12:33 2011-01-02 12:33 2011-01-02 17:01 2011-01-02 17:01 4 4我想把这两条记录合为一条记录求sql代码怎么写?

解决方案 »

  1.   

    没看出有不一样呀 union all
      

  2.   

    http://topic.csdn.net/u/20080612/22/c850499f-bce3-4877-82d5-af2357857872.html?23514
      

  3.   

    SKY00004 xx 周休加班 2011-01-02 2011-01-02 07:50 2011-01-02 07:50 2011-01-02 17:01 2011-01-02 17:01  8  8 周休加班
     
      

  4.   

    我以前有些过 你这个情况比较复杂,需要分多段考虑,建议你写个存储过程
    先用group by 员工时间 min(startime),max(endtime)获取上午的打卡
    最小时间<9点 and 最大时间>12点 扣最小时间和9点和12点到最大时间的总和
    最小时间>9点 and 最大时间>12点 扣除12点到最大时间的差值
    最小时间>9点 and 最大时间<12点 扣0
    最小时间<9点 and 最大时间<12点 扣除最小时间到9点的差值
    晚上类似
    ...
      

  5.   


    SELECT 
    人员编号, 
    姓名, 
    加班名称, 
    刷卡日期, 
    有效开始时间,
    实际开始时间 = MIN(实际开始时间),
    有效结束时间,
    有效结束时间,
    实际结束时间 = MAX(实际结束时间),
    计划加班时长,
    实际加班时长 = DATEDIFF(HOUR, MIN(实际结束时间), MAX(实际开始时间)) - 
    (
    CASE WHEN (DATEPART(HOUR, MAX(实际开始时间)) < 12 AND DATEPART(HOUR, MAX(实际结束时间)) < 18 ) THEN 1 --减去午餐1小时
    WHEN (DATEPART(HOUR, MAX(实际开始时间)) > 13 AND DATEPART(HOUR, MAX(实际结束时间)) > 18) THEN 1 --减去晚餐1小时
    WHEN (DATEPART(HOUR, MAX(实际开始时间)) < 12 AND DATEPART(HOUR, MAX(实际结束时间)) > 18) THEN 2 --减去午餐和晚餐2小时
    --还有其它的情况,比如在午餐或晚餐时间段打的卡,而且DATEPART应该精确到minutes. 本SQL只提供个思路
    ELSE 0 END

    FROM table_name
    GROUP BY
    人员编号, 
    姓名, 
    加班名称, 
    刷卡日期, 
    有效开始时间,
    有效结束时间,
    有效结束时间,
    计划加班时长