获取两个日期时间段之间的数据库搜索结果
Posted
技术标签:
【中文标题】获取两个日期时间段之间的数据库搜索结果【英文标题】:Get database search results between two date time period 【发布时间】:2020-02-06 16:54:46 【问题描述】:在我的数据库中,有一个名为vehicle_schedule 的表,所有的车辆时刻表都存储在那里。在该表中,有两列名称为date_from
date_to
。两列类型均为datetime
。当我通过2019-03-20 09:00:00
2019-03-25 12:00:00
之类的日期时,我需要获取这两个日期时间范围之间的所有车辆时间表。
到目前为止,我已经尝试过了,
$vehicleSchedule=DB::table('vehicle_schedule')
->select('vehicle_schedule.*')
->whereRaw("date_from >=? AND date_to <=?",array($date_from,$date_to))
->get();
return response()->json(["vehicleSchedule"=>$vehicleSchedule,"message"=>"Vehicle Schedule got successfully"]);
我希望所有车辆的时间表都在该给定范围内。但它只获得日期值之间的车辆时间表。当我检查时间限制时,它无法正常工作。
【问题讨论】:
【参考方案1】:试试这个。
$start_date = date('Y-m-d H:i:s',strtotime('2019-03-20 09:00:00'));
$end_date = date('Y-m-d H:i:s',strtotime('2019-03-25 12:00:00'));
$vehicleSchedule=DB::table('vehicle_schedule')
->select('vehicle_schedule.*')
->where([['date_from','<=',$start_date],['date_to','>=',$end_date]])->orwhereBetween('date_from',array($start_date,$end_date))->orWhereBetween('date_to',array($start_date,$end_date))
->get();
【讨论】:
【参考方案2】:我强烈建议使用php Carbon
来处理任何datetime
或timestamp
字段。
要将日期时间字段转换为 Carbon,请在模型中使用它。
protected $dates = ['date_from','date_to'];
然后,将输入时间转换为控制器内部的 Carbon
$date_from = Carbon::parse('2019-03-20 09:00:00');
$date_to = Carbon::parse('2019-03-25 12:00:00');
这样查询会更短、更简洁、更高效。
$vehicleSchedule = DB::table('vehicle_schedule')
->where('date_from','>=',$date_from)
->where('date_to','<=',$date_to)
->get();
【讨论】:
您已经用另一种语法替换了另一种语法,但没有解决问题。 @SalmanA 日期应该大于2019-03-20 09:00:00
并且小于2019-03-25 12:00:00
。我看不出语法有什么问题。
如果我正确理解了问题,那么 OP 已经得到了这个结果(但它只得到了日期值之间的车辆时间表)。如果用户搜索 2019-03-20 ... 2019-03-25,则此查询将不匹配计划于 2019-03-22 ... 2019-03-28 的车辆。但这是我对问题的理解,不一定正确。
@SalmanA 我认为他的结果仅适用于日期。他希望它适用于日期和时间。
@smartrahat 这对我有用。这个技巧真的推荐与 DateTime 一起使用。谢谢!【参考方案3】:
您可以为此使用 Laravel whereBetween
:
$vehicleSchedule=DB::table('vehicle_schedule')
->select('vehicle_schedule.*')
->whereBetween('date_from', [$startDate, $endDate])
->whereBetween('date_to', [$startDate, $endDate])
->get();
这只会选择date_from
和date_to
在两个日期之间的记录。
Related SO post。 Documentation.
【讨论】:
我还建议按照 smartrahat 的建议将您的日期($endDate
和 $startDate
)转换为 Carbon。
这可能是最简单的解决方案。
如果 $start 和 $end 日期分别是 2019-10-10 和 2019-10-20 并且从和到日期分别是 2019-10-01 和 2019-10-31 怎么办?
@SalmanA 它实际上取决于数据库中保存的数据的结构。我完全明白你的意思,但这取决于这些时间表是如何存储的——每天/每小时是否有记录?在这种情况下,那会很好。如果它们像您建议的那样存储在大块中,则不会被捕获。以上是关于获取两个日期时间段之间的数据库搜索结果的主要内容,如果未能解决你的问题,请参考以下文章
(Java / Android) 计算两个日期之间的天数并以特定格式呈现结果