laravel雄辩的查询,检查重叠的开始和结束日期时间字段

vawmfj5a  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(404)

我正在尝试创建一个预订系统,用户可以在其中选择开始日期和时间。系统根据最长的产品服务时间创建结束日期和时间。目前这一切都已解决。
我的数据库中有一个用于我的事件的表:

vendor_id | user_id | start | end

开始列和结束列的类型为datetime。
在我的控制器中,我试图找出某个特定的日期和时间是否可用,但由于某些原因,我无法让它显示时间重叠的项目。
这是我的控制器代码:

$items = $query->where('vendor_id', $user->vendor->id)->where('start', '<=', date('Y-m-d H:i:s', strtotime($start)))->whereDate('end', '>=', date('Y-m-d H:i:s', strtotime($end)))->get();

所以有几个例子。。。
我在系统中有一个事件,开始时间为2019-01-01 13:00:00,结束时间为2019-01-01 17:00:00。
如果我选择的开始时间是2019-01-01 12:00:00,结束时间是2019-01-01 16:00:00,那么它通过了我上面的检查,但是这些时间明显重叠了几个小时。
我试图找到一个解决方案,即使它们重叠,也可以拉项目,而不仅仅是当它们的开始和结束时间满足某个检查条件时。
感谢您的帮助。

gg58donl

gg58donl1#

不完全理解你的问题,但无论如何都会尝试回答。对于日期重叠,我看到四种情况下会发生重叠。将a作为事件时间跨度,b作为搜索参数时间跨度

1)
   A1          A2
B1       B2

2)
   A1          A2
         B1       B2

3)
   A1          A2
B1                B2

4)
   A1          A2
       B1  B2

翻译成对比就是
1) b1<a1和b2>a1
2) b1>a1和b1<a2
3) b1<a1和b2>a1
4) b1>a1和b1<a2
1,3与2,4相同
在拉拉维尔这就足够了

$query->where(function ($query) {
    $query->where([
        [$B1, '<', $A1],
        [$B2, '>', $A1],
    ])->orWhere([
        [$B1, '>', $A1],
        [$B1, '<', $A2],
    ]);
});

作为一个sql语句

where (($B1 < $A1 and $B2 > $A1) or ($B1 > $A1 and $B1 < $A2))

相关问题