これは少し混乱するかもしれませんが、私はそれを伝える最善の方法を考えようとしています! これをいくつかのフォーラムに投稿しましたが、うまくいかないようです。うまくいけば、誰かがこれを行う方法についていくつかの提案を提供できます。
テーブルの例 (tbl_Bookings)
ID DateStarted DateEnded RoomID
1 16/07/2012 09:00 16/07/2012 10:00 1
2 16/07/2012 12:00 16/07/2012 13:00 1
基本的に、2012 年 7 月 16 日 08:30 と 2012 年 7 月 16 日 13:30 のような 2 つの日時を入力すると、上記の例のテーブルがクエリされ、「利用可能な」時間が返されます。次のように出力します。
16/07/2012 08:30 - 16/07/2012 09:00
16/07/2012 10:00 - 16/07/2012 12:00
16/07/2012 13:00 - 16/07/2012 13:30
私の質問は、これは SQL で完全に可能ですか? 私はVBでそれを行う方法を考えようとしましたが、それにも苦労しています。私のアイデア/試みは、Ron Savageのfn_daterangeを使用しています(以下に示すように)
if exists (select * from dbo.sysobjects where name = 'fn_daterange') drop function fn_daterange;
go
create function fn_daterange
(
@MinDate as datetime,
@MaxDate as datetime,
@intval as datetime
)
returns table
as
return
WITH times (startdate, enddate, intervl) AS
(
SELECT @MinDate as startdate, @MinDate + @intval - .0000001 as enddate, @intval as intervl
UNION ALL
SELECT startdate + intervl as startdate, enddate + intervl as enddate, intervl as intervl
FROM times
WHERE startdate + intervl <= @MaxDate
)
select startdate, enddate from times;
go
次に、以下を使用してそれを呼び出すつもりでしたが、私の問題は、me.DateEnded が dr.enddate の外にあるため、発生が「0」になることです。
SELECT dr.startdate, dr.enddate, count(me.DateStarted) as occurrence
FROM fn_daterange('16/07/2012 08:30', '16/07/2012 13:30', '00:30:00' ) dr
LEFT OUTER JOIN tbl_Bookings me
ON me.DateStarted BETWEEN dr.startdate AND dr.enddate
AND me.DateEnded BETWEEN dr.startdate AND dr.enddate)
GROUP BY dr.startdate, dr.enddate
誰かがこれを行うためのより良い方法を提案したり、うまくいけば私が現在やろうとしている方法に対する解決策を提供したりできますか?
前もって感謝します!