注意:代码应该适用于postgres和mysql。
我想按date_from
和date_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
有什么问题?
答案 0 :(得分:7)
它按预期工作。您遇到的问题主要是您要求在完全相同的时间戳之间的时间。虽然您只指定特定日期而非时间,但是包含时间。在这种情况下,它很可能恰好是午夜。因此'20-05-2017'
变为'20-05-2017 00:00:00'
。在这种情况下,除了满足whereBetween
电话的确切时间外,没有时间。
如果您想获取特定日期的记录,最简单的解决方案就是使用:
$query->whereRaw('date(created_at) = ?', [date('Y-m-d')]);
如果您要查询两个不同的日期,您当前的方法将有效。
如果您希望开始时间是一天的开始时间,结束时间是一天结束时,您可以使用Carbon的modifiers来startOfDay
和{{ 1}}:
endOfDay
答案 1 :(得分:3)
工作正常。
问题是你传入的日期只有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:00
和20-05-2017 00:00:00
之间。
答案 2 :(得分:2)
我知道这已经很老了,但是您现在可以使用this
->whereBetween('created_at', [$date_from, $date_to])
in place
of
->whereDate('created_at', '>=', $date_from)
->whereDate('created_at', '<=', $date_to)
答案 3 :(得分:1)
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();