这是一种相对简单、幼稚的做法。假设,就像你说的那样,每个“奇数”行是一个印记,每个“偶数”行是一个印记,你可以分别获取奇数行和偶数行并计算每个工作块。请注意,我使用的 DateDiff 以分钟为单位 (mi) 但您可以将其更改为小时/秒/任意值:http://technet.microsoft.com/en-us/library/ms189794.aspx
;WITH StartTime AS
(
SELECT
badge_no,
punch_timestamp,
myrow
FROM
(
SELECT
badge_no,
punch_timestamp,
ROW_NUMBER() OVER (Partition BY badge_no ORDER BY punch_timestamp ASC) as myrow
FROM #Time
) [t1]
WHERE myrow % 2 = 1 --odd rows
)
,EndTime AS
(
SELECT
badge_no,
punch_timestamp,
myrow - 1 as 'myrow' --Subtract 1 to match up with the odd rows
FROM
(
SELECT
badge_no,
punch_timestamp,
ROW_NUMBER() OVER (Partition BY badge_no ORDER BY punch_timestamp ASC) as myrow
FROM #Time
) [t1]
WHERE myrow % 2 = 0 --even rows
)
SELECT
badge_no,
SUM(diff) as 'MinutesWorked'
FROM
(
SELECT
EndTime.badge_no,
DATEDIFF(mi,
(SELECT TOP 1
punch_timestamp
FROM StartTime
WHERE StartTime.badge_no = EndTime.badge_no
AND StartTime.myrow = EndTime.myrow),
EndTime.punch_timestamp) as 'diff'
FROM EndTime
) [t1]
GROUP BY badge_no
这是我使用的测试数据:
CREATE TABLE #Time
(
badge_no nvarchar(10),
punch_timestamp datetime
)
INSERT INTO #Time VALUES ('100', '2013-01-02 12:01 PM')
INSERT INTO #Time VALUES ('100', '2013-01-02 1:38 PM')
INSERT INTO #Time VALUES ('100', '2013-01-02 2:29 PM')
INSERT INTO #Time VALUES ('100', '2013-01-03 3:01 PM')
INSERT INTO #Time VALUES ('100', '2013-01-03 4:20 PM')
INSERT INTO #Time VALUES ('100', '2013-01-04 12:01 PM')
INSERT INTO #Time VALUES ('100', '2013-01-04 2:01 PM')
INSERT INTO #Time VALUES ('100', '2013-01-04 3:11 PM')
INSERT INTO #Time VALUES ('100', '2013-01-04 4:21 PM')
INSERT INTO #Time VALUES ('100', '2013-01-05 12:01 PM')
INSERT INTO #Time VALUES ('100', '2013-01-05 1:01 PM')
INSERT INTO #Time VALUES ('200', '2013-01-04 2:11 AM')
INSERT INTO #Time VALUES ('200', '2013-01-04 4:34 PM')
INSERT INTO #Time VALUES ('200', '2013-01-05 1:01 AM')
INSERT INTO #Time VALUES ('200', '2013-01-05 4:29 AM')