我有一张预订表,其中包含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;什么类型的房间...请帮助检查可用性的条件。
答案 0 :(得分:3)
请检查一下这样的事情?
select * from table
where DateTo > @datefrom and DateFrom < @dateto
答案 1 :(得分:2)
如果您真正想要做的就是检查单个资源,那么您有一个非常有限的方案列表来检查。
您提供的数据并未考虑结账时间和可能在某一天下午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);
});