MySQL - 日期范围查询

时间:2018-01-12 15:53:55

标签: mysql

SQL小提琴 - http://sqlfiddle.com/#!9/16501a/1

我有这个查询,查找在用户输入的日期范围内未预订的房间:

select rooms.*
from rooms
where 
  (
    rooms.id not in (
      select room_id
      from bookings
      inner join statuses on statuses.id = status_id
      where start <= '2018-01-16 11:00:00'
      and end >= '2018-01-15 12:00:00'
      and statuses.name in ('Approved', 'Completed')
    )
  )
;

--  1st Query - No results due to clashes --

这完全正常,但我希望添加一些额外的逻辑,但我似乎无法让它工作。

作为房间预订流程的一部分,之后会填写一张检查表,此表格中有一个keys_returned_at列,我想将此列添加到帐户中,并将该房间显示为可用,但前提是它没有与现有预订发生冲突。

我尝试在上面添加以下内容:

-- this is the new part --
or (
  rooms.id in (
    select room_id
    from bookings
    inner join statuses on statuses.id = status_id
    inner join checksheets on checksheets.booking_id = bookings.id
    where start <= '2018-01-16 11:00:00'
    and end >= '2018-01-15 12:00:00'
    and statuses.name = 'Completed'
    and checksheets.completed = 1
    and checksheets.keys_returned_at <= '2018-01-16 11:00:00'
  )
)

这似乎主要起作用,但并不限制可能存在于数据库中的任何现有预订,因此当不应该发生冲突时,它会返回结果中的空间。

e.g。示例预订可能是:

房间

id |        start        |           end       | status_id | room_id
--------------------------------------------------------------------
 1 | 2018-01-15 08:00:00 | 2018-01-16 08:00:00 |     1     |    1
 2 | 2018-01-15 11:00:00 | 2018-01-17 08:00:00 |     1     |    1

检查表

id | room_id |  keys_returned_at
----------------------------------
 1 |    1    | 2018-01-15 10:00:00

示例搜索条件为2018-01-15 12:00:002018-01-16 12:00:00

如果只预订一个在数据库中,那么应该在结果中返回房间1,因为它不会与搜索字词冲突,因为它在keys_returned_at时间戳之后开始(并且结束没有冲突)与任何其他预订,只是没有任何其他预订),但是,当涉及预订两个时,由于搜索开始日期是start预订日期2之后,因此不应返回可用性。

0 个答案:

没有答案