我有一个表格,显示每个时间戳的不同值。每次值发生变化时,都会在表格中插入一条线(如温度计控制器)。
显示记录只会产生更改和时间戳。我的问题是我需要每分钟左右显示结果,即使该值根本没有变化。并且没有在表格中插入“空白”线条。
我尝试右键加入我的表格,其中的视图显示了同一日期的所有getdate()
戳记,但我无法使查询生效。
05 Sep 2016 09:50:24 20
05 Sep 2016 09:56:14 18
应该是
05 Sep 2016 09:50:24 20
05 Sep 2016 09:51:24 20
05 Sep 2016 09:52:24 20
05 Sep 2016 09:53:24 20
05 Sep 2016 09:54:24 20
05 Sep 2016 09:55:24 20
05 Sep 2016 09:56:14 18
05 Sep 2016 09:57:24 18
.
.
答案 0 :(得分:2)
您需要使用递归CTE。我假设对于日期时间列调用ChangedDate
,对于问题第二列中的任何值调用SomeValue
。
;WITH cte AS (
SELECT t.ChangedDate,
t.SomeValue,
p.ChangedDate as NextDate
FROM YourTable t
OUTER APPLY (
SELECT top 1 *
FROM YourTable
WHERE t.ChangedDate <ChangedDate
ORDER BY ChangedDate
) p
UNION ALL
SELECT DATEADD(minute,1,ChangedDate),
SomeValue,
NextDate
FROM cte
WHERE DATEADD(minute,1,ChangedDate) < NextDate
)
SELECT ChangedDate,
SomeValue
FROM cte
ORDER BY ChangedDate
OPTION (MAXRECURSION 0)
对于您的样本,它将输出:
ChangedDate SomeValue
2016-09-05 09:50:24.000 20
2016-09-05 09:51:24.000 20
2016-09-05 09:52:24.000 20
2016-09-05 09:53:24.000 20
2016-09-05 09:54:24.000 20
2016-09-05 09:55:24.000 20
2016-09-05 09:56:14.000 18
如果再添加一个字符串('2016-09-05 10:00:34', 17)
,则会输出:
ChangedDate SomeValue
2016-09-05 09:50:24.000 20
2016-09-05 09:51:24.000 20
2016-09-05 09:52:24.000 20
2016-09-05 09:53:24.000 20
2016-09-05 09:54:24.000 20
2016-09-05 09:55:24.000 20
2016-09-05 09:56:14.000 18
2016-09-05 09:57:14.000 18
2016-09-05 09:58:14.000 18
2016-09-05 09:59:14.000 18
2016-09-05 10:00:14.000 18
2016-09-05 10:00:34.000 17
如果您需要此日志持续到当前时间更改此部分:
p.ChangedDate as NextDate
在CTE中:
COALESCE(p.ChangedDate,GETDATE()) as NextDate