以时间格式计算备用列的差异?

时间:2016-03-16 08:05:07

标签: datetime ms-access-2007

Status  Date    Time
1   2016-03-16  8:00:00
0   2016-03-16  12:00:00
1   2016-03-16  16:00:00
0   2016-03-16  20:00:00
1   2016-03-16  23:55:00
0   2016-03-17  01:16:00
1   2016-03-17  02:20:00
0   2016-03-17  04:00:00
1   2016-03-17  08:00:00
0   2016-03-17  12:00:00
1   2016-03-17  04:00:00
0   2016-03-17  06:00:00

我有上面提到的表。我想要做的是我想要计算状态变化的时间之间的差异 例如,在前两列中,它应返回4小时的时差 然后我不想计算第2和第3列之间的差异我想计算第3和第4列之间的差异等等....... 时差应该是时间格式,如4小时或58分钟 总体而言,当状态从1变为0时,我将计算差异 请帮忙。

2 个答案:

答案 0 :(得分:1)

试试这样:

编辑:DATE和TIME与DATETIME的组合更改为更简单的方式

DECLARE @tbl TABLE([Status] INT,  [Date] DATE,    [Time] TIME);
INSERT INTO @tbl VALUES
 (1,'2016-03-16','8:00:00')
,(0,'2016-03-16','12:00:00')
,(1,'2016-03-16','16:00:00')
,(0,'2016-03-16','20:00:00')
,(1,'2016-03-16','23:55:00')
,(0,'2016-03-17','01:16:00')
,(1,'2016-03-17','02:20:00')
,(0,'2016-03-17','04:00:00')
,(1,'2016-03-17','08:00:00')
,(0,'2016-03-17','12:00:00')
,(1,'2016-03-17','04:00:00')
,(0,'2016-03-17','06:00:00');

WITH AllStarts AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY [Date],[Time]) AS RowInx
          ,CAST([date] AS DATETIME)+CAST([time] AS DATETIME) AS TimePoint
    FROM @tbl
    WHERE [Status]=1
)
,AllEnds AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY [Date],[Time]) AS RowInx
          ,CAST([date] AS DATETIME)+CAST([time] AS DATETIME) AS TimePoint
    FROM @tbl
    WHERE [Status]=0
)
SELECT AllStarts.RowInx
      ,AllStarts.TimePoint AS StartPoint
      ,AllEnds.TimePoint AS [EndPoint]
      ,CAST(AllEnds.TimePoint - AllStarts.TimePoint AS TIME) AS TimeDiff
FROM AllStarts
INNER JOIN AllEnds ON AllStarts.RowInx=AllEnds.RowInx

结果:

1   2016-03-16 08:00:00.000    2016-03-16 12:00:00.000     04:00:00.0000000
2   2016-03-16 16:00:00.000    2016-03-16 20:00:00.000     04:00:00.0000000
3   2016-03-16 23:55:00.000    2016-03-17 01:16:00.000     01:21:00.0000000
4   2016-03-17 02:20:00.000    2016-03-17 04:00:00.000     01:40:00.0000000
5   2016-03-17 04:00:00.000    2016-03-17 06:00:00.000     02:00:00.0000000
6   2016-03-17 08:00:00.000    2016-03-17 12:00:00.000     04:00:00.0000000

答案 1 :(得分:0)

sql server 2012+的简单解决方案,但它可能不适用于ms-access 2007。

;WITH cte as
(
SELECT  [Status], 
        [Date], 
        [Time], 
        CAST([Date] as datetime) + CAST([Time] As datetime) As [datetime]
FROM MyTable 
WHERE [Date] >= @StartDate
AND [Date] <= @EndDate
)

SELECT  [Status], 
        [Date], 
        [Time], 
        CASE WHEN [Date] = LAG([Date]) OVER (ORDER BY [datetime]) THEN
            CAST(DATEADD(MINUTE, DATEDIFF(MINUTE, LAG([datetime]) OVER (ORDER BY [datetime]), [datetime]), '00:00:00') as time) 
        ELSE 
            NULL
        END
        As TimeDifference
FROM cte 

结果(基于提供的数据)

Status Date       Time             TimeDifference
------ ---------- ---------------- ----------------
1      2016-03-16 08:00:00.0000000 NULL
0      2016-03-16 12:00:00.0000000 04:00:00.0000000
1      2016-03-16 16:00:00.0000000 04:00:00.0000000
0      2016-03-16 20:00:00.0000000 04:00:00.0000000
1      2016-03-16 23:55:00.0000000 03:55:00.0000000
0      2016-03-17 01:16:00.0000000 01:21:00.0000000
1      2016-03-17 02:20:00.0000000 01:04:00.0000000
0      2016-03-17 04:00:00.0000000 01:40:00.0000000
1      2016-03-17 04:00:00.0000000 00:00:00.0000000
0      2016-03-17 06:00:00.0000000 02:00:00.0000000
1      2016-03-17 08:00:00.0000000 02:00:00.0000000
0      2016-03-17 12:00:00.0000000 04:00:00.0000000