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
;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