注意:代码应该适用于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"}
]
Run Code Online (Sandbox Code Playgroud)
码:
$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();
Run Code Online (Sandbox Code Playgroud)
当我查询date_from = '20-05-2017'和date_to = '20-05-2017',我看到一个空数组.我希望看到20-05-2017Foo不管.如果我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')]);
Run Code Online (Sandbox Code Playgroud)
如果您要查询两个不同的日期,您当前的方法将起作用.
如果你想开始的时间是一天的开始和结束时间是你可以使用碳的一天结束修饰此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();
Run Code Online (Sandbox Code Playgroud)
我的开始日期和结束日期的格式为YYYY-mm-dd
$query->whereBetween('created_at', [$request->startdate.' 00:00:00', $request->enddate.' 23:59:59']);
Run Code Online (Sandbox Code Playgroud)
只需将时间与您的日期连接起来即可。
它工作正常。
问题是您传递的是 whereBetween 仅日期Y-m-d格式,laravel 正在将此格式与Y-m-d H:i:screated_at 列的格式进行比较。
当你只经过时Y-m-d,它就会转变为Y-m-d 00:00:00。所以你的created_at2017-05-20 11:18:00不在20-05-2017 00:00:00和之间20-05-2017 00:00:00。
| 归档时间: |
|
| 查看次数: |
3931 次 |
| 最近记录: |