如何找到表中不存在的值?

nav*_*tor 5 sql sql-server

我有一个简化的表Bookings,有两列BookDateBookSlot.该BookDate列仅包含日期(没有时间),该BookSlot列将包含从0到1410(包括0和1410)的30分钟间隔的一天中的时间.(即600 =上午10:00)

如何在未经过循环的情况下找到未来可用的第一个插槽(未预订)?

这是表定义和测试数据:

Create Table Bookings(
    BookDate DateTime Not Null,
    BookSlot Int Not Null
)
Go

Insert Into Bookings(BookDate,BookSlot) Values('2014-07-01',0);
Insert Into Bookings(BookDate,BookSlot) Values('2014-07-01',30);
Insert Into Bookings(BookDate,BookSlot) Values('2014-07-01',60);
Insert Into Bookings(BookDate,BookSlot) Values('2014-07-01',630);
Insert Into Bookings(BookDate,BookSlot) Values('2014-07-02',60);
Insert Into Bookings(BookDate,BookSlot) Values('2014-07-02',90);
Insert Into Bookings(BookDate,BookSlot) Values('2014-07-02',120);
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来返回表中没有的第一个可用插槽,以及将来(基于服务器时间).

根据以上测试数据:

  • 如果当前服务器时间是7月1日00:10 am,结果应该是7月1日,90分钟(01:30 am).
  • 如果当前服务器时间是7月2日,01:05 am,结果应该是7月2日,150分钟(02:30 am).

如果将来没有预订,该功能将简单地返回将来最接近的半小时.

-

这个SQL小提琴就在这里:

http://sqlfiddle.com/#!6/0e93d/1

Jay*_*vee -1

尝试这个:

SELECT a.bookdate, ((a.bookslot/60.)+.5) * 60
FROM bookings a LEFT JOIN bookings b 
ON a.bookdate=b.bookdate AND (a.bookslot/60.)+.50=b.bookslot/60.
WHERE b.bookslot IS null
Run Code Online (Sandbox Code Playgroud)