如果在Laravel 5的日期范围内检查日期


Checking dates if between range of dates in Laravel 5

我有一个booked表,startend列作为日期戳;

我知道这个

$start = "2015-07-12 01:00:00";
$end = "2015-07-12 02:00:00";
$users = DB::table('booked')
                    ->whereBetween('start', [$start, $end])->get();

检查start列中落在$start和$end范围内的任何日期。

我想要的实际上是另一种方式。

我在book表的startend列中检查$start和$end date变量出现时遇到困难。

// make sure $from is before $till, because they are probably provided as input
$from = min($start, $end);
$till = max($start, $end);
// then simply
DB::table('booked')
     ->where('start', '<=', $from)
     ->where('end', '>=', $till)
     ->get();

它将返回start-end period中包含的$from-$till period匹配的行:

    start                     end
      |------------------------|
         |----------------|
       $from            $till

请在给定的代码下尝试,这将检查所请求的日期时间是否已预订,如果任何时间段已预订,则返回1,否则返回0:

$start = $request->start_date; 
$end = $request->end_date; 
DB::table('booked')->where(function ($query) use ($start, $end) {
    $query->where(function ($q) use ($start, $end) {
        $q->where('start', '>=', $start)
           ->where('start', '<', $end);
    })->orWhere(function ($q) use ($start, $end) {
        $q->where('start', '<=', $start)
           ->where('end', '>', $end);
    })->orWhere(function ($q) use ($start, $end) {
        $q->where('end', '>', $start)
           ->where('end', '<=', $end);
    })->orWhere(function ($q) use ($start, $end) {
        $q->where('start', '>=', $start)
           ->where('end', '<=', $end);
    });
})->count();

我用这个代码解决了我的问题,在我的情况下,我有多个封锁日期,其中我们不能允许用户注册新的预订,所以我们必须检查以下12个地点:

$start_date = $request->start_date; 
$end_date = $request->end_date; 
DB::table('booked')->where(function ($query) use ($start_date, $end_date) {
    $query->where(function ($q) use ($start_date, $end_date) {
        $q->where('start_date', '>=', $start_date)
            ->where('start_date', '=<', $start_date);
    })->orWhere(function ($q) use ($start_date, $end_date) {
        $q->where('end_date', '>=', $start_date)
            ->where('end_date', '<=', $start_date);
    })->orWhere(function ($q) use ($start_date, $end_date) {
        $q->where('start_date', '>=', $end_date)
            ->where('start_date', '<=', $end_date);
    })->orWhere(function ($q) use ($start_date, $end_date) {
        $q->where('end_date', '>=', $end_date)
            ->where('end_date', '<=', $end_date);
    })->orWhere(function ($q) use ($start_date, $end_date) {
        $q->where('start_date', '<=', $start_date)
            ->where('end_date', '>=', $start_date);
    })->orWhere(function ($q) use ($start_date, $end_date) {
        $q->where('start_date', '<=', $end_date)
            ->where('end_date', '>=', $end_date);
    });
})->count();

下面的查询将给出的起始和结束都在$start和$end之间的所有记录:

$users = DB::table('booked')
  ->where('start', '>=', $start)
  ->where('start', '<=', $end)
  ->where('end', '>=', $start)
  ->where('end', '<=', $end);