2009-06-24 101 views
2

我正在写一个职位空缺数据库一点乐趣(和尝试和学习T-SQL/SQL Server的,这就是我在我的申请表,到目前为止在预订表检查可用性。初学者:在SQL

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语句会发现这些出足够容易

我现在唯一的问题是如何找出什么。天不包含预订。我想在下面的表格中查找在“2008-12-25 00:00:00”和“2008年之间location_id 100”的房间中有哪些日期可用-12-30 00:00:00“,并且从27日到28日没有在房间里进行采访的回报。

我确信这很容易,但请给我一些SQL智慧。

此类似:How to implement check availability in hotel reservation system

回答

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 

未经测试,但类似的东西可能工作。

1

可以生成包含你的日子的临时表(无论是在上层或具有存储功能,它会更好,如果这是SQL学习目的),然后OUTER JOIN它在预订表上并过滤记录与NULL匹配application_id。

0

首先,我会被打破您的查询“2008-12-25 00:00:00”到“00:00:00 2008-12-30”到每一天“的时间段”开始。这对于表变量和while循环来说是相对容易的,所以我不会在这里进入。

,那么你可以通过每个从表变量的时间周期循环,看看它是否重叠任何现有预订的(你只会拉出重叠查询时间段的预约)。为此我建议使用这个帮助函数:

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 

如果两个时间段重叠,则返回1,否则返回0。即使预订区块并不总是一整天,这也具有工作的优势。