在Laravel 5中检查日期是否在日期范围内

4
我已经预定了一个带有开始和结束日期时间戳列的桌子;
我知道这个……(后续缺失)
$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”表中“start”和“end”列中是否出现了 $start 和 $end 日期变量。

1
你说的“另一种方式”是什么意思?是指开始日期在给定的起始/结束范围之外的记录吗? - jedrzej.kurylo
жҲ‘зҗҶи§Јзҡ„ж„ҸжҖқжҳҜдёҠйқўзҡ„жҹҘиҜўжЈҖжҹҘstartеҲ—жҳҜеҗҰеңЁ$startе’Ң$endд№Ӣй—ҙгҖӮжҲ‘жғіиҰҒжүҫеҮәзҡ„жҳҜ$startе’Ң$endжҳҜеҗҰиҗҪеңЁвҖңstartвҖқе’ҢвҖңendвҖқеҲ—д№Ӣй—ҙгҖӮ - shaNnex
4个回答

7
// 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();

它将返回在“开始-结束”时期内包含的$from-$till时间段的行:
    start                     end
      |------------------------|
         |----------------|
       $from            $till

非常简单而明智的解决方案 - Emeka Mbah
不如在订购$start$end日期之前,首先验证它们是否有效,以确保$start包含的日期在$end之前?使用Laravel的当前验证规则,您可以简单地完成这项工作。否则,在假设的表单中,您可能会看到:“查找从2020年1月28日到2020年1月20日的预订”,这将导致正确的查询,但对我来说应该是一个验证错误。 - mdexp
嗨Jarek,我喜欢这个解决方案。我有一个相关的问题。是否可能只获取不在开始和结束之间的行?提前谢谢! - Robert

6
请尝试使用以下代码,它将检查所请求的日期和时间是否已被预订,如果有任何时间段已被预订,则返回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();

0
我用这段代码解决了我的问题,在我的情况下,我有多个被阻止的日期,我们不能允许用户注册新的预订,因此我们必须检查以下12个Where条件:
$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();

-1
以下查询将为您提供所有起始时间和结束时间均在$start和$end之间的记录:
$users = DB::table('booked')
  ->where('start', '>=', $start)
  ->where('start', '<=', $end)
  ->where('end', '>=', $start)
  ->where('end', '<=', $end);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接