【问题标题】:Laravel's whereBetween not including date fromLaravel whereBetween 不包括日期
【发布时间】:2020-12-24 17:52:18
【问题描述】:

注意:代码应该适用于 postgres 和 mysql。

我想通过date_fromdate_to 查询一个表。假设有一个日期范围,格式为:('d-m-Y')

富:

[
 {'id': 1, "created_at": "2017-05-20 11:18:00"},
 {'id': 2, "created_at": "2017-05-24 11:38:36"}
]

代码:

$format = 'd-m-Y';
$df = $request->input('date_from');
$dt = $request->input('date_to');
$date_from = Carbon::createFromFormat($format, $df);
$date_to = Carbon::createFromFormat($format, $dt);

Foo::whereBetween('created_at', [$date_from, $date_to])->get()->toArray();

当我查询 date_from = '20-05-2017'date_to = '20-05-2017' 时,我看到一个空数组。我希望看到20-05-2017 Foo 无论如何。如果我date_from = '19-05-2017'date_to = '21-05-2017',我看到20-05-2017 的数组。

whereBetween 有什么问题?

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    它按预期工作。您遇到的问题主要是您要求完全相同的时间戳之间的时间。虽然您只指定特定日期而不是时间,但其中包含了时间。在这种情况下,它很可能正好是午夜。所以'20-05-2017' 变成了'20-05-2017 00:00:00'。在这种情况下,除了满足您的whereBetween 呼叫的确切时间之外,没有其他时间。

    如果您想获取特定日期的记录,最简单的解决方案是使用:

    $query->whereRaw('date(created_at) = ?', [date('Y-m-d')]);
    

    如果您希望在两个不同日期之间进行查询,您当前的方法将有效。

    如果您希望开始时间是一天的开始,而结束时间是一天的结束,您可以使用 Carbon 的 modifiers 来实现 startOfDayendOfDay

    $date_from = Carbon::parse($request->input('date_from'))->startOfDay();
    $date_to = Carbon::parse($request->input('date_to'))->endOfDay();
    
    $result = Foo::whereDate('created_at', '>=', $date_from)
        ->whereDate('created_at', '<=', $date_to)
        ->get()
        ->toArray();
    

    【讨论】:

      【解决方案2】:

      它工作正常。

      问题是您只传递了 whereBetween date Y-m-d 格式,而 laravel 正在将此格式与 created_at 列的 Y-m-d H:i:s 格式进行比较。

      当您只传递Y-m-d 时,它将被转换为Y-m-d 00:00:00。所以你的 created_at 2017-05-20 11:18:00 不在20-05-2017 00:00:0020-05-2017 00:00:00 之间。

      【讨论】:

      • 谢谢。现在我明白了。但请原谅我,我也必须奖励给出编码答案的人。不过,我给了你一个赞成票 ;) ;)
      【解决方案3】:

      我知道这是旧的,但你现在可以使用 this

      ->whereBetween('created_at', [$date_from, $date_to])
      

      in place

      ->whereDate('created_at', '>=', $date_from)
      ->whereDate('created_at', '<=', $date_to)
      

      【讨论】:

      • 是的,这适用于另一个特定日期,没有天数增量。
      【解决方案4】:

      我的开始日期和结束日期的格式为 YYYY-mm-dd

      $query->whereBetween('created_at', [$request->startdate.' 00:00:00', $request->enddate.' 23:59:59']);
      

      只需将时间与您的日期连接起来。

      【讨论】:

        【解决方案5】:

        createFromFormat 根据给定的输入创建日期,并将丢失的时间替换为您的当前时间。所以改用parse,你甚至不需要指定表单。其次,您使用whereBetween 检查完整的时间戳,而不仅仅是日期。您是第一行 2017-05-20 11:18:00 超出日期范围,因此它不会返回该值。您需要使用whereDate 仅根据日期检查项目而忽略时间。

        $date_from = Carbon::parse($request->input('date_from'));
        $date_to = Carbon::parse($request->input('date_to'));
        
        $result = Foo::whereDate('created_at', '>=', $date_from)
            ->whereDate('created_at', '<=', $date_to)
            ->get()
            ->toArray();
        

        【讨论】:

          猜你喜欢
          • 2016-09-18
          • 2020-12-11
          • 2018-11-08
          • 1970-01-01
          • 1970-01-01
          • 2018-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多