Sql server 2008 如何为同一列中的时间值计算工作时间

Sql server 2008 如何为同一列中的时间值计算工作时间,sql-server-2008,tsql,datetime,datediff,Sql Server 2008,Tsql,Datetime,Datediff,我有以下数据,其中所有的时钟输入和时钟输出都在同一列中。以下是我注意到数据变得怪异的地方: 打卡上班的人忘记打卡下班,反之亦然 数据分布在一个较长的时期(2-3年) 有相同的时钟输入/输出的重复项 一个人可以使用打卡打卡值工作 一个人可以在晚上10点开始工作,第二天早上8点结束工作 早上好 我有以下数据供你考虑。还请查看有关此问题的SQL FIDLE。 *编辑:向SQLFiddle添加新数据。*它只允许8k字符。悲哀的 如果对象ID('tempdb..#tettable')不为空,则删除表#te

我有以下数据,其中所有的时钟输入和时钟输出都在同一列中。以下是我注意到数据变得怪异的地方:

  • 打卡上班的人忘记打卡下班,反之亦然
  • 数据分布在一个较长的时期(2-3年)
  • 有相同的时钟输入/输出的重复项
  • 一个人可以使用打卡打卡值工作
  • 一个人可以在晚上10点开始工作,第二天早上8点结束工作 早上好
  • 我有以下数据供你考虑。还请查看有关此问题的SQL FIDLE。 *编辑:向SQLFiddle添加新数据。*它只允许8k字符。悲哀的 如果对象ID('tempdb..#tettable')不为空,则删除表#tettable 创建表#诱人( 雇员姓名varchar(40岁), 雇员ID INT, PostEditPunchValue日期时间, PunchDate日期时间, FormatTime varchar(20), )

    下面是我想出的代码。只要工作时间不超过8小时,它就可以正常工作,但也会过滤掉一些合法记录,其中一个人可能在给定的班次上工作了9-10小时。有人能告诉我哪里出了问题,我需要做些什么来修复它吗

    ;WITH 
    CTE2T AS
    (
        SELECT DISTINCT EmployeeName, PostEditPunchValue from #TempTable
        WHERE PostEditPunchValue BETWEEN PostEditPunchValue AND DATEADD(HH,23,PostEditPunchValue) AND PostEditPunchValue <> PunchDate
        and EmployeeName = 'FNU, LNU M' 
    ),
    CTE1 AS
    (
        SELECT  
             T1.EmployeeName
            ,t1.PostEditPunchValue StartDate
            ,min(t2.PostEditPunchValue) EndDate
        FROM 
            CTE2T AS t1
            LEFT JOIN CTE2T AS t2 ON (t1.EmployeeName = t2.EmployeeName
                                      and  t1.PostEditPunchValue < t2.PostEditPunchValue)
        WHERE 
            t1.EmployeeName = 'FNU, LNU M' 
        group by
            t1.PostEditPunchValue
        ,   t1.EmployeeName
    ),
    CTE2 AS
    ( 
        SELECT 
            EmployeeName, StartDate, EndDate,
            DATEDIFF(HH,StartDate,EndDate) 'Hours' 
        from 
            cte1 
        group by 
            EmployeeName, StartDate, EndDate
    )
    SELECT * FROM cte2 where Hours > 8 or Hours = 0
    

    你能简要描述一下你对这些专栏的看法吗。通常在这种类型的表中,您只会看到EmployeeID、InDateTime和OutDateTime。具体地说,您能告诉我最后三列的意图是什么吗?请还包括运行查询的预期结果。这将有助于确定问题。我的错。PostEditPunchValue列同时具有inTime和OutTime。我知道这是个糟糕的设计,但那是我继承的。我正在发布我看到的输出。但有时我会遇到例外情况,PostEditPunchValue在第n行的“EndDate”重复,然后在第n+1行的StartDate重复。假设重复的打孔表示在没有员工打孔的情况下打孔是否可靠?这是一个好问题,我想答案是肯定的。
    ;WITH 
    CTE2T AS
    (
        SELECT DISTINCT EmployeeName, PostEditPunchValue from #TempTable
        WHERE PostEditPunchValue BETWEEN PostEditPunchValue AND DATEADD(HH,23,PostEditPunchValue) AND PostEditPunchValue <> PunchDate
        and EmployeeName = 'FNU, LNU M' 
    ),
    CTE1 AS
    (
        SELECT  
             T1.EmployeeName
            ,t1.PostEditPunchValue StartDate
            ,min(t2.PostEditPunchValue) EndDate
        FROM 
            CTE2T AS t1
            LEFT JOIN CTE2T AS t2 ON (t1.EmployeeName = t2.EmployeeName
                                      and  t1.PostEditPunchValue < t2.PostEditPunchValue)
        WHERE 
            t1.EmployeeName = 'FNU, LNU M' 
        group by
            t1.PostEditPunchValue
        ,   t1.EmployeeName
    ),
    CTE2 AS
    ( 
        SELECT 
            EmployeeName, StartDate, EndDate,
            DATEDIFF(HH,StartDate,EndDate) 'Hours' 
        from 
            cte1 
        group by 
            EmployeeName, StartDate, EndDate
    )
    SELECT * FROM cte2 where Hours > 8 or Hours = 0
    
    EmployeeName                   StartDate             EndDate        Hours   Flag
    
    
    ANDERSON, LETICIA G|    2007-01-02 08:17:00.000|    2007-01-02 15:30:00.000| 7| 
    ANDERSON, LETICIA G|    2009-01-02 08:00:00.000|    2009-01-02 16:25:00.000| 8| 
    ANDERSON, LETICIA G|    2009-01-03 07:50:00.000|    2009-01-03 16:01:00.000| 9| Y