【问题标题】:MYSQL query on DateTime, find existing bookingsDateTime上的MYSQL查询,查找现有预订
【发布时间】:2014-04-26 04:49:08
【问题描述】:

我有一张用于预订停车位的桌子。最短预订时间为 30 分钟,最长预订时间为 1 天(即预订不会跨越多天)。预订不得重叠,即任何时候每个车位只能有 1 辆车,因此在插入新预订之前,我会先检查是否有预订可用。

id      buyerid         startdatetime   enddatetime            vehicle  spaceid
2       5       2014-04-23 09:00:00     2014-04-23 21:30:00     2       1
3       6       2014-04-25 13:00:00     2014-04-25 22:00:00     3       1

我想查询表,提供 startdatetime、enddatetime 和 spaceid,并查明在给定时间该空间是否存在预订。我只需要从查询中返回 true 或 false。

例如,如果我提供了您在上面看到的当前数据集:

startdatetime=2014-04-23 09:00:00 AND enddatetime= 2014-04-23 11:00:00 -- 查询将返回 TRUE,因为行 id 2 定义了在提供的时间存在的预订。

startdatetime=2014-04-23 22:00:00 AND enddatetime= 2014-04-23 23:30:00 -- 查询将返回 FALSE,因为当时没有预订。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您可以通过简单的比较和聚合来做您想做的事情:

    select (case when count(*) > 0 then 'false' else 'true' end)
    from bookings b
    where b.spaceid = @SPACEID and
          b.startdatetime < @ENDTIME and
          b.enddatetime > @STARTTIME;
    

    如果一个时段在另一个结束之前开始,并且在另一个开始之后结束,则两个时段重叠。

    不过,理想情况下,您会希望将餐桌布置成不能同时预订任何空间。一种方法是为每个空间设置一张桌子,并为一天设置 48 个插槽(每半小时一个)。不是每行都有一个范围,而是每个时间段都有一行。然后,您可以在 spaceid, timeslot 上拥有一个唯一约束(索引),并且数据库将为您强制执行此逻辑 - 与必须在表中搜索可能重叠的预订相比,开销要少得多。

    【讨论】:

    • 这听起来就像我需要的一样,但是我很挣扎:s 看到空间也可以订阅,我已经走了这么远,但它仍然很远。我实际上认为为每个空间创建一个表是不好的做法,但似乎不是
    • @brux 。 . .你的问题没有提到订阅。如果您有更严重的问题,我鼓励您提出另一个问题。编辑这个是不公平的,会使原始问题的答案无效。
    • 我的意思是,根据您的改进建议更改 db a 的定义会产生进一步的后果,您的答案很好,并且经过测试后 100% 正确,谢谢
    【解决方案2】:

    您可以使用简单的 SQL 语句:

    SELECT * FROM table
    WHERE startdatetime > $Start
    AND enddatetime < $End
    

    然后放入IF(expression ,expr_true, expr_false);see Doc here

    IF((SELECT * FROM table
        WHERE startdatetime > $Start
        AND enddatetime < $End
    )  ,'true', 'false');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多