初学者:在SQL
问题描述:
我正在写一个职位空缺数据库一点乐趣(和尝试和学习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
答
一种方法是将日期范围放入表变量中并加入。
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
未经测试,但类似的东西可能工作。
答
可以生成包含你的日子的临时表(无论是在上层或具有存储功能,它会更好,如果这是SQL学习目的),然后OUTER JOIN
它在预订表上并过滤记录与NULL
匹配application_id。
答
首先,我会被打破您的查询“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。即使预订区块并不总是一整天,这也具有工作的优势。