姓名      日期      时间冯志伟 2008-6-5   07:31:00
冯志伟 2008-6-5   18:32:00
冯志伟 2008-6-6   07:34:00
冯志伟 2008-6-6   17:08:00
冯志伟 2008-6-10   07:33:00
冯志伟 2008-6-10    17:48:00
冯志伟 2008-6-11   07:34:00
冯志伟 2008-6-11    08:20:00
冯志伟 2008-6-11    08:21:00
冯志伟 2008-6-11    18:16:00
冯志伟 2008-6-12   07:35:00
冯志伟 2008-6-12    19:20:00
如上,是员工在6月份某几天的打卡记录,其中有三个字段:姓名、日期、时间,求员工每一天具体工作的时间。    有如下要求:
        1、进厂:7:00-8:00AM间按正常上班时间开始计,7:00AM前进厂按实际入厂减7:00AM的工时计算;
            例如:6:50进厂就算提前加班半小时,7:10进厂就不算加班。
        2、中午:只要在上午进厂,下午离厂,中间均减1.5小时的休息时间;
        3、离厂时间:17:00-17:30间离厂均按正常下班计,超出17:30离厂按实际离厂减17:30的工时计算。      
            例如:17:25离厂就不算加班,18:00离厂就算加班半小时。
非常急,在线等,万分感谢!

解决方案 »

  1.   

    CREATE TABLE TEST_DATA
    (NAME VARCHAR(255),
    LOG_DATE DATETIME)INSERT INTO TEST_DATA
    SELECT 'FENZHIWEI','2008-6-5 07:31:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-5 18:32:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-6 07:34:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-6 17:08:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-10 07:33:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-10 17:48:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-11 07:34:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-11 08:20:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-11 08:21:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-11 18:16:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-12 07:35:00'
    UNION ALL
    SELECT 'FENZHIWEI','2008-6-12 19:20:00'--筛选多打卡的记录
    select NAME,MAX(LOG_DATE) AS END_TIME,MIN(LOG_DATE) AS BEGIN_TIME INTO #TEMP FROM TEST_DATA
    GROUP BY NAME,CONVERT(VARCHAR(10),LOG_DATE,120)ALTER TABLE #TEMP
    ADD END_TIME_FORMAT DATETIME,
    BEGIN_TIME_FORMAT DATETIME--格式化上下班时间
    UPDATE A
    SET A.BEGIN_TIME_FORMAT = CASE WHEN BEGIN_TIME BETWEEN 
    CONVERT(DATETIME,CONVERT(VARCHAR(10),BEGIN_TIME,120)+' 07:00:00') AND 
    CONVERT(DATETIME,CONVERT(VARCHAR(10),BEGIN_TIME,120)+' 08:00:00') 
    THEN CONVERT(DATETIME,CONVERT(VARCHAR(10),BEGIN_TIME,120)+' 08:00:00')
    ELSE BEGIN_TIME END,
    A.END_TIME_FORMAT = CASE WHEN END_TIME BETWEEN 
    CONVERT(DATETIME,CONVERT(VARCHAR(10),END_TIME,120)+' 17:00:00') AND 
    CONVERT(DATETIME,CONVERT(VARCHAR(10),END_TIME,120)+' 17:30:00') 
    THEN CONVERT(DATETIME,CONVERT(VARCHAR(10),END_TIME,120)+' 17:00:00')
    ELSE END_TIME END
    FROM #TEMP A--获取工作时间(分钟计)
    select *,DATEDIFF(mi,BEGIN_TIME_FORMAT,END_TIME_FORMAT)-90 AS WORK_TIME FROM #TEMP