Laravel的位置之间不包括日期

时间:2017-05-24 12:51:16

标签: laravel laravel-5

注意:代码应该适用于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有什么问题?

4 个答案:

答案 0 :(得分:7)

它按预期工作。您遇到的问题主要是您要求在完全相同的时间戳之间的时间。虽然您只指定特定日期而非时间,但是包含时间。在这种情况下,它很可能恰好是午夜。因此'20-05-2017'变为'20-05-2017 00:00:00'。在这种情况下,除了满足whereBetween电话的确切时间外,没有时间。

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

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

如果您要查询两个不同的日期,您当前的方法将有效。

如果您希望开始时间是一天的开始时间,结束时间是一天结束时,您可以使用Carbon的modifiersstartOfDay和{{ 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:0020-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();