我知道這個人可能會遇到一些混亂,我只是想要考慮把它放在一起的最佳方式!我已經在幾個論壇發佈了這個帖子,但我似乎沒有任何運氣。希望有人可以提供一些關於如何做到這一點的建議。從2個日期時間列表可用的時間
實施例表(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
基本上,我要進入2週日期時間,如16/07/2012 08:30 16/07/2012 13:30和它會查詢我上面的示例表並返回'可用'時間,IE,我想它輸出以下內容。
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中做到這一點,我也在努力。我的想法/曾試圖用羅恩野人的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
任何人都可能認爲這樣做的更好的方法或希望提供一個解決方案,我想現在做到這一點?
在此先感謝!
什麼時間'16/07/2012 09:90'? – 2012-07-16 19:58:51
Tim Schmelte,Easter Egg =) – 2012-07-16 19:59:52
你使用什麼dbms,SQL-Server(哪個版本)?基本上你有一個開始日期時間和一個結束日期時間(因此是一個TimeSpan。現在你想要找到半小時是免費的(沒有預訂)。這是正確的嗎? – 2012-07-16 20:00:54