我已在网站上审核并尝试了大量代码示例,但我没有更接近解决我的问题。我认为部分原因在于我的编码技巧,部分原因是SQL Server 2008R2缺少LAG。
我的表Clock__Times
包含数万行这些列:
EMP_NO, ACCOUNT_DATE, IN_STAMP, OUT_STAMP
发生时钟输出活动时会添加一行。每天可以为给定员工添加多行。我需要在时钟输出时间(ACCOUNT_DATE BETWEEN D1 & D2
)和下一个时钟(OUT_STAMP
之间的时间内识别行并计算员工在给定时间跨度(IN_STAMP
)内的时间。 )该员工少于X小时但大于Y小时。
我尝试了各种JOIN
但它们总是错误的,因为我必须将同一行的OUT_STAMP
与为同一员工添加的下一行的IN_STAMP
进行比较。
Y值是为了避免午餐时钟进出活动,并且可能有2小时的值。 X值用于识别在轮班之间没有足够时间的员工,例如10小时。
我最终必须扩大规模,以确定在一段时间内没有足够休假的所有员工。
答案 0 :(得分:1)
好的,这是一个潜在解决方案的试验。
标准:
这是一个完整的SQL示例,它创建了一个包含数据和最后查询的示例表:
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'SO23010761')
DROP TABLE SO23010761
GO
CREATE TABLE SO23010761
(
emp INT,
dt DATETIME,
type CHAR(1)
)
GO
INSERT INTO SO23010761
VALUES
(1, '2014-01-01 08:00', 'I'),
(1, '2014-01-01 08:15', 'O'),
(1, '2014-01-01 10:30', 'I'),
(1, '2014-01-01 16:00', 'O'),
(2, '2014-01-01 08:00', 'I'),
(2, '2014-01-01 08:15', 'O'),
(2, '2014-01-01 10:30', 'I'),
(2, '2014-01-01 16:00', 'O')
GO
WITH meta
AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY emp ORDER BY dt) AS ROWNUM
FROM
SO23010761
)
SELECT
*
FROM
(
SELECT
M1.emp,
M1.dt AS dt_out,
M2.dt AS dt_in,
DATEDIFF(MI, M1.dt, M2.dt) AS DIFF
FROM
meta M1
INNER JOIN meta M2
ON M1.emp = M2.emp
AND M1.rownum = M2.rownum - 1
WHERE
M1.type = 'O'
AND M2.type = 'I'
) AS dummy
WHERE
DIFF >= 2 * 60
AND DIFF <= 10 * 60
GO
这将: