Tsql 在SQL中检查预订表的可用性

Tsql 在SQL中检查预订表的可用性,tsql,Tsql,我写一个职位空缺数据库是为了找点乐子(也是为了尝试和学习T-SQL/SQL Server,这就是我目前在应用程序表中的内容) application_id name interviewer location_id from to ---------------------------------------------------------------------------------------------------

我写一个职位空缺数据库是为了找点乐子(也是为了尝试和学习T-SQL/SQL Server,这就是我目前在应用程序表中的内容)

application_id  name         interviewer      location_id      from                  to
-----------------------------------------------------------------------------------------------------------
1               Joe Bloggs   Sarah Saunders   100              2008-12-25 00:00:00   2008-12-26 00:00:00
2               Barry White  Issac Hayes      100              2008-12-29 00:00:00   2008-12-30 00:00:00
很容易找到这些日期的预订情况;一个简单的select语句就可以很容易地找到这些预订情况

我现在唯一的问题是如何找出哪些日期不包含预订。我想在下表中搜索一下,看看位置id为100的房间在“2008-12-25 00:00:00”和“2008-12-30 00:00:00”之间有哪些日期可用并回复27日至28日房间内没有面试


我相信这非常简单,但请给我一些SQL智慧。

您可以生成一个包含天数的临时表(在上层或使用存储函数,如果是为了SQL学习,这会更好),然后
OUTER JOIN
将其添加到预订表中,并对具有
NULL
匹配应用程序id的记录进行筛选。

首先,我将首先将您的查询“2008-12-25 00:00:00”分解为“2008-12-30 00:00:00”分为“时间段”对于一个表变量和一个while循环,这是相对容易的,所以我在这里不再赘述

然后,您可以从table变量循环遍历每个时间段,并查看它是否与任何现有预订重叠(您将只提取与查询时间段重叠的预订)。为此,我建议使用此helper函数:

CREATE FUNCTION [dbo].[fn_TimePeriodsOverlap] 
(
    @pStartTP1 datetime,
    @pEndTP1 datetime,
    @pStartTP2 datetime,
    @pEndTP2 datetime
)
RETURNS bit
AS
BEGIN
    DECLARE @Result bit
    SET @Result = 0

    IF @pStartTP1 >= @pStartTP2 AND @pStartTP1 < @pEndTP2
            SET @Result = 1
    ELSE IF @pEndTP1 >= @pStartTP2 AND @pEndTP1 < @pEndTP2
            SET @Result = 1
    ELSE IF @pStartTP2 >= @pStartTP1 AND @pStartTP2 < @pEndTP1
            SET @Result = 1
    ELSE IF @pEndTP2 >= @pStartTP1 AND @pEndTP2 < @pEndTP1
            SET @Result = 1

    RETURN @Result

END
创建函数[dbo]。[fn\u TimePeriodsOverlap]
(
@PStartP1日期时间,
@pEndTP1日期时间,
@PStartP2日期时间,
@pEndTP2日期时间
)
返回位
作为
开始
声明@Result位
设置@Result=0
如果@pStartTP1>=@pStartTP2和@pStartTP1<@pEndTP2
设置@Result=1
如果@pEndTP1>=@pStartTP2和@pEndTP1<@pEndTP2
设置@Result=1
如果@pStartTP2>=@pStartTP1和@pStartTP2<@pEndTP1
设置@Result=1
否则如果@pEndTP2>=@pStartTP1和@pEndTP2<@pEndTP1
设置@Result=1
返回@Result
结束

如果两个时间段重叠,则返回1,否则返回0。这样做的好处是,即使预订块不总是一整天,也能正常工作。

一种方法是将日期范围放入表变量中并联接

declare @startDate datetime, @endDate datetime

SET @startDate = '2009-05-01'
SET @endDate = '2009-05-31'

declare @dates table (date datetime)

insert into @dates values (@startDate)

while @startDate < @endDate
begin
    set @startDate = @startDate + 1

    insert into @dates values (@startDate)
end

select d.* from applications a
left join @dates d on d.date between a.from and a.to
where a.application_id is null
声明@startDate datetime,@endDate datetime
设置@startDate='2009-05-01'
设置@endDate='2009-05-31'
声明@dates表(日期时间)
插入@dates值(@startDate)
而@startDate<@endDate
开始
设置@startDate=@startDate+1
插入@dates值(@startDate)
结束
从应用程序a中选择d.*
左连接@dates d on d.date介于a.from和a.to之间
其中a.application\u id为空
没有经过测试,但类似的东西可能会起作用