【问题标题】:How to query between two dates using Laravel and Eloquent?如何使用 Laravel 和 Eloquent 在两个日期之间进行查询?
【发布时间】:2016-01-26 11:45:11
【问题描述】:

我正在尝试创建一个显示从特定日期到特定日期的报告的报告页面。这是我当前的代码:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();

这在普通 SQL 中的作用是 select * from table where reservation_from = $now

我这里有这个查询,但我不知道如何将其转换为 eloquent 查询。

SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to

如何将上面的代码转换为 eloquent 查询?提前谢谢你。

【问题讨论】:

  • reservation_from 中的日期格式是什么。您可以基于此使用碳值。
  • 日期格式为 TIMESTAMP @AthiKrishnan
  • 就像Reservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get();

标签: php laravel laravel-5 orm


【解决方案1】:

以下应该有效:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
                           ->where('reservation_from', '<=', $to)
                           ->get();

【讨论】:

    【解决方案2】:

    whereBetween 方法验证列的值是否介于 两个值。

    $from = date('2018-01-01');
    $to = date('2018-05-02');
    
    Reservation::whereBetween('reservation_from', [$from, $to])->get();
    

    在某些情况下,您需要动态添加日期范围。根据@Anovative 的评论,您可以这样做:

    Reservation::all()->filter(function($item) {
      if (Carbon::now()->between($item->from, $item->to)) {
        return $item;
      }
    });
    

    如果您想添加更多条件,可以使用orWhereBetween。如果您想排除日期间隔,则可以使用whereNotBetween

    Reservation::whereBetween('reservation_from', [$from1, $to1])
      ->orWhereBetween('reservation_to', [$from2, $to2])
      ->whereNotBetween('reservation_to', [$from3, $to3])
      ->get();
    

    其他有用的 where 子句:whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime, @9876543 @, whereRaw.

    Laravel docs about Where Clauses.

    【讨论】:

    • 如果$from$to 是属于模型的动态日期,将如何处理?因为有一个effective_atexpires_at 字段,我想查询当前项目是否在该范围内。我尝试了each() 和一个使用Carbon::now()-&gt;between( ... ) 的if,但它仍然返回所有结果。
    • 编辑我上面的评论:忽略了filter(),这成功了。 MyModel::all()-&gt;where('column', 'value')-&gt;filter(function ($item) { if (Carbon::now-&gt;between($item-&gt;effective_at, $item-&gt;expires_at)) { return $item; } })-&gt;first();
    • @Anovative 感谢您的有用评论。我会根据您的评论更新我的答案。
    • 第二种方法有问题。它将所有记录从数据库加载到内存,然后只有它会执行过滤。
    • 非常感谢您为我节省了很多时间!
    【解决方案3】:

    试试这个:

    由于您基于单个列值进行获取,因此您可以同样简化查询:

    $reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();
    

    根据条件检索:laravel docs

    希望这会有所帮助。

    【讨论】:

    • 如果你想要一个从 2021 年 2 月 1 日到 2021 年 5 月 31 日的寄存器,并且这个寄存器是在 2021 年 5 月 31 日创建的,它不会起作用,在这种情况下你应该使用这个:whereDate('created_at', '&gt;=', $this-&gt;start_date) -&gt;whereDate('created_at', '&lt;=', $this-&gt;end_date) -&gt;get()
    【解决方案4】:

    如果您的字段是 datetime 而不是 date,则另一种选择(虽然它适用于两种情况):

    $fromDate = "2016-10-01";
    $toDate   = "2016-10-31";
    
    $reservations = Reservation::whereRaw(
      "(reservation_from >= ? AND reservation_from <= ?)", 
      [
         $fromDate ." 00:00:00", 
         $toDate ." 23:59:59"
      ]
    )->get();
    

    【讨论】:

    • 技术上不需要是 $toDate 。 “ 23:59.59.999” ?
    • @stevepowell2000 这取决于您的数据库,在我的情况下,我们以这种格式 'YYYY-MM-DD HH:MM:SS' 将日期存储在 datetime mysql 字段中,没有微秒精度。相关信息:dev.mysql.com/doc/refman/8.0/en/datetime.html
    • 好点。因此,如果它是一个日期时间或时间戳字段,我们可能一直到 23:59:59.999999 “一个 DATETIME 或 TIMESTAMP 值可以包括一个尾随小数秒部分,最长可达微秒(6 位) 精度。”
    • 谢谢你一直帮我完成我的任务!喜欢这个答案兄弟! :) -habie
    【解决方案5】:

    如果要检查当前日期是否存在于 db 中的两个日期之间: =>如果员工的申请开始和截止日期在今天存在,则查询将获取申请列表。

    $list=  (new LeaveApplication())
                ->whereDate('from','<=', $today)
                ->whereDate('to','>=', $today)
                ->get();
    

    【讨论】:

      【解决方案6】:

      我已经创建了模型范围

      关于范围的更多信息:

      代码:

         /**
           * Scope a query to only include the last n days records
           *
           * @param  \Illuminate\Database\Eloquent\Builder $query
           * @return \Illuminate\Database\Eloquent\Builder
           */
          public function scopeWhereDateBetween($query,$fieldName,$fromDate,$todate)
          {
              return $query->whereDate($fieldName,'>=',$fromDate)->whereDate($fieldName,'<=',$todate);
          }
      

      在控制器中,将碳库添加到顶部

      use Carbon\Carbon;
      

      从现在开始获取过去 10 天的记录

       $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(10)->startOfDay()->toDateString(),(new Carbon)->now()->endOfDay()->toDateString() )->get();
      

      从现在开始获取过去 30 天的记录

       $lastThirtyDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(30)->startOfDay()->toDateString(),(new Carbon)->now()->endOfDay()->toDateString() )->get();
      

      【讨论】:

      • WhereDateBetween 第二个参数需要是一个数组。
      • 这只是模型的一个范围,它不是 Builder 方法
      • 哦,是的,不知何故错过了。我的坏:)
      【解决方案7】:

      我知道这可能是一个老问题,但我发现自己不得不在 Laravel 5.7 应用程序中实现此功能。以下是我的工作。

       $articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();
      

      您还需要使用碳

      use Carbon\Carbon;
      

      【讨论】:

        【解决方案8】:

        如果你需要在什么时候有一个日期时间字段应该是这样的。

        return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();
        

        【讨论】:

        • 嗨,欢迎来到 Stack Overflow。在回答已经有很多答案的问题时,请务必添加一些额外的见解,说明为什么您提供的回复是实质性的,而不是简单地呼应原始发帖人已经审查过的内容。这在您提供的“纯代码”答案中尤其重要。
        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 2020-06-03
        • 2018-08-11
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多