我有这个表,其中包含一个包含 DateTime 值的 ScheduledTime 列;这些是 3 小时测试的开始时间。该列看起来像这样:
SELECT ScheduledTime from Schedule;
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-16 16:34:36.000
2012-03-20 09:14:48.000
2012-03-20 13:14:48.000
2012-03-20 17:14:48.000
2012-03-20 21:14:48.000
2012-04-14 17:13:19.000
2012-04-14 21:13:19.000
2012-04-15 01:13:19.000
2012-04-15 05:13:19.000
2012-04-15 09:13:19.000
2012-04-15 13:13:19.000
2012-04-15 17:13:19.000
2012-04-15 21:13:19.000
2012-04-16 01:13:19.000
2012-04-16 05:13:19.000
2012-04-16 13:13:19.000
2012-04-16 17:13:19.000
2012-04-17 01:13:19.000
2012-04-17 05:13:19.000
2012-04-17 13:13:19.000
2012-04-18 18:29:16.000
2012-04-19 15:48:12.000
2012-04-19 19:10:00.000
2012-04-19 23:47:00.000
2012-04-20 10:27:28.000
2012-04-20 17:27:00.000
上面列出的日期时间值是 3 小时测试的开始时间。所以我需要获得下一个可用插槽进行 3 小时测试。如果它可以容纳在现有测试或 currentTime+1hr 中,则最好。
任务是生成一个列(比如 SlotsColumn),它保存从 ScheduledTime 列获得的 3 小时时隙的开始时间,并且 SlotsColumn 的值 > {fn Now()} 即 CurrentTime。
可选的是,如果它没有任何这样的值,它应该给 CurrentTime+1hr
使用 SQL Server 2008。
I have tried this:
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY [ScheduledTime] ) AS rn
FROM [dbo].[Schedule]
WHERE [ScheduledTime] IS NOT NULL
)
SELECT TOP(1)
DATEADD(second,10800, mc.ScheduledTime) AS NextTime
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
WHERE (DATEDIFF(SECOND, mc.ScheduledTime, mp.ScheduledTime) - 10800) >= 10800
order by mc.ScheduledTime DESC
查询返回未来一个有效开始时间的列表,前提是它存在。
对于上面的示例数据,它返回 '2012-04-20 03:47:00.000' 这是错误的,因为它不认为在 '2012-04-20 17:27:00.000' 有另一个测试。它们不应重叠。所需的输出是:“2012-04-20 12:27:00.000”,因为它是在“2012-04-20 10:27:28.000”测试之后和“2012-04-20 17”测试之前: 27:00.000',非常适合 3 小时测试。我的 CurrentTime 是 '2012-04-20 11:45:23.393'
如果不存在这样的有效时间,我如何确保它返回 CurrentTime+1hr?
它可以在 C# 中完成,但尝试使用 SQL 查询。
请提供任何帮助/提示。