获取两个日期时间段之间的数据库搜索结果

Posted

技术标签:

【中文标题】获取两个日期时间段之间的数据库搜索结果【英文标题】:Get database search results between two date time period 【发布时间】:2020-02-06 16:54:46 【问题描述】:

在我的数据库中,有一个名为vehicle_schedule 的表,所有的车辆时刻表都存储在那里。在该表中,有两列名称为date_fromdate_to。两列类型均为datetime。当我通过2019-03-20 09:00:002019-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 来处理任何datetimetimestamp 字段。

要将日期时间字段转换为 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_fromdate_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) 计算两个日期之间的天数并以特定格式呈现结果

如何在mysql选择查询中获取两个日期之间的日期列表[重复]

查询两个日期之间的数据

获取两个日期之间的月份范围

如何获取帐户在两个日期之间进行的转发列表?

获取在两个日期之间发布的数据