房间可用性检查SQL

时间:2015-10-16 16:06:14

标签: sql-server

我有一张预订表,其中包含2列DateFrom和DateTo。 现在,当用户想要检查房间的可用性时,我应该使用此预订表进行验证,并确认房间是否可用。

我将2个参数@datefrom和@dateto传递给我的sql查询。

declare @DateFrom datetime
declare @DateTo datetime

set @DateFrom ='10/15/2015'
set @DateTo = '10/18/2015'

SELECT * FROM tblBooking WITH(NOLOCK) WHERE  
((DateFrom <= @DateFrom AND DateTo >= @DateFrom)
OR (DateTo >= @DateTo AND  DateFrom <= @DateTo))

问题是,如果另一位用户已预订2015年10月16日至2015年10月17日,那么系统应显示&#34;不可用&#34;消息。

请留下原因&#34;选择*&#34;什么类型的房间...请帮助检查可用性的条件。

5 个答案:

答案 0 :(得分:3)

请检查一下这样的事情?

select * from table 
where DateTo > @datefrom and DateFrom < @dateto

答案 1 :(得分:2)

如果您真正想要做的就是检查单个资源,那么您有一个非常有限的方案列表来检查。 enter image description here

您提供的数据并未考虑结账时间和可能在某一天下午4点提供的房间,而不是同一天早些时候提前6小时。由于您没有指定任何该标准,因此我不会特别详细说明这些细节。我相信你可以通过3&#34; Where&#34;来解决所有这些问题。条件;

WHERE
(
@DateFrom BETWEEN DateFrom and DateTo /* Solves 1,4,5 */
OR
@DateEnd BETWEEN DateFrom and DateTo /* Solves 2,4,5 */
OR
DateFrom BETWEEN @DateFrom and @DateEnd /* Solves 2,3,5 */
)

条件1,3求解一次,条件2,4,5求解多次,但它们只需求解一次。从理论上讲,如果你的tblBookings中有一个房间号,那么这将返回该时间跨度内所有可用资源的列表。

答案 2 :(得分:1)

select case when count(*) = 0 then 'Available' else 'Not available' end
from tblBooking
where DateFrom <= @DateTo and DateTo >= @DateFrom

我唯一能想到的是你要检查重叠的日期范围,并且你需要(尽管select *)返回可用性的是/否指标。如果存在一行,则count(*)将大于零,因此会发生冲突。

答案 3 :(得分:0)

对于您引用的具体案例 (DateFrom是2015年10月16日,DateTo是10/17/2015, @DateFrom是2015年10月15日,@ DateTo是10/18/2015) ,逻辑是:

(DateFrom >= @DateFrom AND DateTo >= @DateFrom
 AND DateTo <= @DateTo AND  DateFrom <= @DateTo)

由于表格中的条目必须在终点之间。

答案 4 :(得分:0)

我通过在现有查询中添加它来解决它:

app.controller('AppCtrl',function($scope,$timeout){
    $scope.objectArray = [];

    $timeout(function(){
      $scope.objectArray.push({
        id: 1,
        name : "Abc",
        type : "type1"
      });
    },2000);

  });