我们每隔一秒存储一次系统的实验数据。我们还存储Date-Time,system_ON_Status以及其他参数。根据一天的要求(可能是3-4次)打开系统。
现在我们需要生成查询以显示实验的开始和停止时间。
system_ON_Status字段在SQL中存储为布尔值。
对于ON为真,对于OFF为假。
由于
我们正在使用SQL SERVER 2008 R2
Date_Time System_ON_Status
2014-03-04 16:01:01:000 0
2014-03-04 16:01:02:000 0
2014-03-04 16:01:03:000 0
2014-03-04 16:01:04:000 0
2014-03-04 16:01:05:000 1
2014-03-04 16:01:06:000 1
2014-03-04 16:01:07:000 1
2014-03-04 16:01:08:000 1
2014-03-04 16:01:09:000 1
2014-03-04 16:01:10:000 0
2014-03-04 16:01:11:000 0
2014-03-04 16:01:12:000 1
2014-03-04 16:01:13:000 1
2014-03-04 16:01:14:000 1
2014-03-04 16:01:15:000 1
2014-03-04 16:01:16:000 0
2014-03-04 16:01:17:000 0
2014-03-04 16:01:18:000 0
2014-03-04 16:01:19:000 1
2014-03-04 16:01:20:000 1
2014-03-04 16:01:21:000 1
2014-03-04 16:01:22:000 1
2014-03-04 16:01:23:000 1
2014-03-04 16:01:24:000 1
输出必须是: 1)实验开始,即16:01:05:000 和实验结束16:01:09:000 系统运行:16:01:05:000-16:01:09:000之间的差异 4秒
2)实验开始,即16:01:12:000 和实验结束16:01:15:000 系统运行:16:01:05:000-16:01:09:000之间的差异 3秒
2)实验开始,即16:01:19:000 和实验结束16:01:24:000 系统运行:16:01:05:000-16:01:09:000之间的差异 5秒
答案 0 :(得分:0)
以下查询为您提供每个实验的开始和结束时间。它包括system_on_status
变回零的时间,因为这是实验结束的确认。在上一个实验的情况下,它还没有结束(system_on_status
没有零)所以结束时间是NULL
。
SELECT FromTime = MIN(D.log_date)
,X.ToTime
,D.system_on_status
FROM Experiment_Log D
OUTER APPLY ( SELECT TOP 1
ToTime = D2.log_date
FROM Experiment_Log D2
WHERE D.log_date < D2.log_date
AND D.[system_on_status] <> D2.[system_on_status]
ORDER BY D2.log_date
) X
WHERE D.system_on_status = 1
GROUP BY X.ToTime
,D.system_on_status
ORDER BY FromTime;
为此输出数据:
FromTime ToTime system_on_status
2014-03-04 16:01:05 2014-03-04 16:01:10 1
2014-03-04 16:01:12 2014-03-04 16:01:16 1
2014-03-04 16:01:19 NULL 1
我无法为此获得任何荣耀,我从this excellent answer接受了查询并将其修改为您的表格。因此,如果你想进行投票,请给ErikE代表! :)