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内に収容できる場合が最適です。
タスクは、ScheduledTime列から取得された3時間スロットの開始時間を保持する列(たとえばSlotsColumn)を生成することであり、SlotsColumn値は> {fn Now()}、つまりCurrentTimeです。
オプションとして、そのような値がない場合は、CurrentTime+1hrを指定する必要があります。
SQLServer2008の使用。
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
クエリは、存在する場合にのみ、将来の1つの有効な開始時刻のリストを返します。
上記のサンプルデータに対して、「2012-04-20 03:47:00.000」が返されます。これは、「2012-04-20 17:27:00.000」に別のテストがあるとは見なされないため、間違っています。それらは重なってはいけません。必要な出力は次のとおりです。「2012-04-2012:27:00.000」のように、「2012-04-20 10:27:28.000」でのテスト後、「2012-04-2017」でのテスト前です。 27:00.000'なので、3時間のテストに最適なスロットです。私にとってのCurrentTimeは「2012-04-2011:45:23.393」です。
そのような有効な時間が存在しない場合、CurrentTime + 1hrが返されるようにするにはどうすればよいですか?
これはC#で実行できますが、SQLクエリを試してみてください。
ヘルプ/ヒントをお願いします。