Laravel 的 whereBetween 不包括日期

标签 laravel laravel-5

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

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

Foo:

[
 {'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 有什么问题吗?

最佳答案

它正在按预期工作。您遇到的问题主要是您要求完全相同的时间戳之间的时间。虽然您只指定了特定的日期而不是时间,但其中包含了时间。在这种情况下,很可能正好是午夜。因此,'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();

关于Laravel 的 whereBetween 不包括日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44158949/

相关文章:

php - 如何配置 Laravel mail.php 使用内置邮件功能?

laravel-5 - 如何将 sendgrid 电子邮件模板 ID 传递给邮件发送功能?

javascript - 如何在 daterangepicker JS 和 Laravel 中禁用占用日期

php - Laravel 连接 mysql 时出现问题

Laravel Mix 不编译 Tailwind CSS

php - Laravel 在哪里存储 throttle 数据?

php - 自动将 ServiceProviders laravel 添加到 config/app.php 并自动加载配置

php - Laravel 5.2 命名空间

php - Laravel - 如何向浏览器提供新的 Laravel 项目

php - Laravel AND、多个 OR Eloquent 查询未按预期工作