我知道这可能会让人有些困惑,我只是想考虑一下最好的表达方式!我现在已经在几个论坛上发布了这个,但我似乎没有任何运气。希望有人可以就如何做到这一点提供一些建议。
示例表 (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 中做到这一点,我也在努力解决这个问题。我的想法/尝试一直在使用 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
任何人都可以提出更好的方法,或者希望为我目前尝试的方式提供解决方案吗?
提前致谢!