Sql 带日期和时间的停车场预订可用性查询

Sql 带日期和时间的停车场预订可用性查询,sql,linq-to-sql,Sql,Linq To Sql,我正在实施一个停车预约系统,用户在其中预约一个停车位 预订表 空间表 用户可以使用参数startDate、startTime、EndDate、EndTime检查可用停车位 如果avialableSpaces==noOfBookings,则停车位不可用 找出startDate、StartTime和EndDate、EndTime之间是否有可用停车位的逻辑是什么?您可以通过询问ParkingSpaceID来获得特定时间内可用停车位的数量,而该停车位ID不存在您给定时间开始或结束的预订时间 顺便问一下:

我正在实施一个停车预约系统,用户在其中预约一个停车位

预订表

空间表

用户可以使用参数startDate、startTime、EndDate、EndTime检查可用停车位

如果avialableSpaces==noOfBookings,则停车位不可用


找出startDate、StartTime和EndDate、EndTime之间是否有可用停车位的逻辑是什么?

您可以通过询问ParkingSpaceID来获得特定时间内可用停车位的数量,而该停车位ID不存在您给定时间开始或结束的预订时间

顺便问一下:为什么你要在你的桌子上拆分日期和时间?我能想到的唯一原因是有可能有一个没有另一个,例如,一天没有指定时间,也没有默认时间相关。如果是这种情况,你必须在上面的选择中考虑这一点。如果没有,您应该更改表的设计

编辑:由于您的预订表有一个parkingSpaceId,我假设还有一个停车位表,其中每个停车位都有一条记录。这里有一个可能的说法。这取决于dbms语句的确切外观。我在这里使用Oracle的AddTime函数来组合日期和时间,以便于比较。必须使用单独的日期和时间字段总是有点像akward,如果其中一个字段可以为空(这将是拆分的唯一合理原因),则更为复杂。你必须相应地调整对账单

select parkingspaceid
from parkingspaces s
where not exists
(
  select *
  from reservations r
  where r.parkingspaceid = s.id
  and 
  (
    ( 
      addtime(:startdate,:starttime) >= addtime(r.startdate,r.starttime)
      and 
      addtime(:startdate,:starttime) < addtime(r.enddate,r.endtime)
    )
    or
    ( 
      addtime(:enddate,:endtime) >= addtime(r.startdate,r.starttime)
      and 
      addtime(:enddate,:endtime) < addtime(r.enddate,r.endtime)
    )
  )
);

请注意,它应该是可用空间,而不是可用空间。我的要求是分割日期和时间。但我不知道如何比较stratDate startTime、EndDate和EndTime之间的可用停车位。因为停车位没有可用空间,用户也可以按小时预订。也许我误解了。让我们看看。。。如果我想知道parkingSpaceId 123是否在周五10:00到11:00有空,我会寻找这段时间的预订。如果我在9:00到10:30之间预订了房间,那么这个地方就不可用了,因为这个地方部分是在预定的时间预订的。我看到了这一点,因为我的10:00开始时间在9:00到10:30之间。因此,方法是在每个parkingSpaceId的开始日期时间或结束日期时间所在的范围内查看是否存在。预订是按小时进行的。请您编写sql查询以供我理解。我添加了sql大纲。我没有用你的太空桌,因为它对我来说没什么意义。我假设我使用的parkingspaceid中有另一个表,每个表有一条记录?
columns
--------
avialableSpaces
noOfBookings
select parkingspaceid
from parkingspaces s
where not exists
(
  select *
  from reservations r
  where r.parkingspaceid = s.id
  and 
  (
    ( 
      addtime(:startdate,:starttime) >= addtime(r.startdate,r.starttime)
      and 
      addtime(:startdate,:starttime) < addtime(r.enddate,r.endtime)
    )
    or
    ( 
      addtime(:enddate,:endtime) >= addtime(r.startdate,r.starttime)
      and 
      addtime(:enddate,:endtime) < addtime(r.enddate,r.endtime)
    )
  )
);
select parkingspaceid
from parkingspaces s
where not exists
(
  select *
  from reservations r
  where r.parkingspaceid = s.id
  and 
  (
    ( 
      addtime(:startdate,:starttime) >= addtime(r.startdate,r.starttime)
      and 
      addtime(:startdate,:starttime) < addtime(r.enddate,r.endtime)
    )
    or
    ( 
      addtime(:enddate,:endtime) >= addtime(r.startdate,r.starttime)
      and 
      addtime(:enddate,:endtime) < addtime(r.enddate,r.endtime)
    )
  )
);