【问题标题】: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"]);

我希望所有车辆的时间表都在该给定范围内。但它只获得日期值之间的车辆时间表。当我检查时间限制时,它无法正常工作。

【问题讨论】:

    标签: mysql laravel datetime date-range laravel-query-builder


    【解决方案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 postDocumentation.

      【讨论】:

      • 我还建议按照 smartrahat 的建议将您的日期($endDate$startDate)转换为 Carbon。
      • 这可能是最简单的解决方案。
      • 如果 $start 和 $end 日期分别是 2019-10-10 和 2019-10-20 并且从和到日期分别是 2019-10-01 和 2019-10-31 怎么办?
      • @SalmanA 它实际上取决于数据库中保存的数据的结构。我完全明白你的意思,但这取决于这些时间表是如何存储的——每天/每小时是否有记录?在这种情况下,那会很好。如果它们像您建议的那样存储在大块中,则不会被捕获。
      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多