注意:代码应该适用于 postgres 和 mysql。
我想通过 date_from
和 date_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对于此 startOfDay
和 endOfDay
:
$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/