【问题标题】:Laravel eloquent where date is equal or greater than DateTimeLaravel 雄辩,其中日期等于或大于 DateTime
【发布时间】:2017-10-31 04:05:27
【问题描述】:

我正在尝试从日期列高于或等于当前时间的模型中获取关系数据。

日期列的格式如下:Y-m-d H:i:s

我要做的是获取 Y-m-d H:i:s 未来所在的所有行。

示例:假设日期是 2017-06-01,时间是 09:00:00 然后我想得到日期在未来的所有行,时间在未来。

目前我的代码看起来像这样,它几乎可以工作,但它没有抓取日期为当天的行。

public function customerCardFollowups() {
    return $this -> hasMany('App\CustomerCardFollowup', 'user_id') -> whereDate('date', '>', Carbon::now('Europe/Stockholm')) -> orderBy('date', 'asc') -> take(20);
}

我做错了什么? 提前致谢。

【问题讨论】:

  • 如果您想在支票中考虑时间,请使用where 而不是whereDate,使用>= 而不是>
  • 我会试试的。谢谢
  • 似乎只使用“where”来修复它。谢谢!
  • 那是因为whereDate只会使用值的日期部分而忽略时间。

标签: php mysql laravel datetime eloquent


【解决方案1】:

听起来你需要使用>=,例如:

->whereDate('date', '>=', Carbon::now('Europe/Stockholm'))

【讨论】:

  • 我也试过了,但到最后好像还不行。例如,如果日期是正确的,但时间超过了日期列的时间,则不应获取它。只应获取尚未过去的日期(包括时间)。
  • @Kaizokupuffball 你修好了吗?我有同样的问题,只用where 代替whereDate
  • 这只会比较日期(2020-08-07)而忽略时间部分(12:15:09)。
  • 此解决方案将忽略时间,并在提出的问题中返回同一天 2017-06-01 09:00 之前的记录。您可以在此处查看我的答案以在比较中包含时间:stackoverflow.com/a/69687327/4332391
【解决方案2】:

你可以在这里使用:

->where('date', '>=', date('Y-m-d'))

【讨论】:

    【解决方案3】:

    对于 Laravel 的测试用例:

    $this->assertDatabaseHas('my_table', [
        'name' => $name,
        [ 'updated_at', '>=', $updatedAt ] // $updatedAt is a Carbon object
    ]);
    

    【讨论】:

      【解决方案4】:

      使用whereDate仅比较日期而忽略时间。因此,您的解决方案将给出至少在一天后约会的记录,并且将不包括在同一天但更晚时间的记录。

      如果您按照其他答案中的建议使用>=,您将获得从当前日期开始的记录以及甚至在确定时间之前的记录。

      对此的一个解决方案是比较使用whereRaw 中的 MySQL 函数。在您的代码中,日期的条件将如下所示:

      -> whereRaw("date > STR_TO_DATE(?, '%Y-%m-%d %H:%i:%s')" , Carbon::now('Europe/Stockholm')->format('Y-m-d H:i'));
      

      在代码中,我更改了 Carbon 日期的格式以匹配特定格式,您可以使用您想要的任何格式并将相同的格式放入 STR_TO_DATE 函数中。

      【讨论】:

      • 这对我有用,谢谢
      • 很高兴听到这个消息。
      猜你喜欢
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2015-03-31
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多