php Laravel Eloquent从日期时间字段比较日期

vom3gejh  于 2022-10-30  发布在  PHP
关注(0)|答案(8)|浏览(218)

我想通过一个表达式从表中获取所有行:

table.date <= 2014-07-10

但如果列包含日期时间,我们可以说:

2014-07-10 12:00:00

但如果我这样做:

where('date', '<=', $date)

它就不会得到该行。
我猜这是因为$date = 2014-07-10,这使得MySQL假设它是2014-07-10 00:00:00。
在一般MySQL中,我只会

where DATE(date) <= $date

使用Laravel的雄辩术会有什么效果?

hyrbngr7

hyrbngr71#

Laravel 4+为您提供以下方法:第一个是第二个是第三个,第四个是第三个。
它们为您执行SQL DATE()工作,并管理SQLite的差异。
你的结果可以这样实现:

->whereDate('date', '<=', '2014-07-10')

有关更多示例,请参见#3946的第一条消息和此Laravel Daily article

**Update:**尽管上述方法很方便,但正如阿尔斯所指出的,它在大型数据集上效率很低,因为必须对每条记录应用DATE() SQL函数,从而丢弃可能的索引。

以下是进行比较的一些方法(但请阅读下面的注解):

->where('date', '<=', '2014-07-10 23:59:59')

->where('date', '<', '2014-07-11')

// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');

->where('date', '<', $dayAfter)

备注:

  • 23:59:59还可以(目前),因为精度为1秒,但请看一下这篇文章:23:59:59 is not the end of the day. No, really!
  • 请记住“零日期”的情况(“0000-00-00 00:00:00”)。虽然应该避免这些“零日期”,但它们是许多问题的根源。如果需要,最好将字段设置为可空。
pgx2nnw8

pgx2nnw82#

您是否考虑过使用:

where('date', '<', '2014-08-11')

您应避免在MySQL中对索引列使用DATE()函数,因为这会阻止引擎使用索引.

更新

由于对DATE()和索引的重要性似乎存在一些分歧,我创建了一个小提琴来演示它们的区别,请参见POSSIBLE KEYS

sdnqo3pr

sdnqo3pr3#

您可以从以下语法中选择一种,获取日期为“2016-07-14”或"2016-07-14“之前的所有记录:

->whereDate('date','=','2014-07-10')

->whereDate('date', '<=', '2014-07-10')

或使用动态日期的另一个代码

whereDate('date',$date)
bwitn5fc

bwitn5fc4#

你可以用这个

whereDate('date', '=', $date)

如果给予whereDate,则只比较日期时间字段中日期

kknvjkwl

kknvjkwl5#

use Carbon\Carbon;

public function scopePublished($query)
{
  $now = Carbon::now();
  $date = Carbon::parse($now)->toDateString();
  $time = Carbon::parse($now)->toTimeString();
  return $query->whereDate('published_at', '<', $date)
  ->orWhere(function($query) use ($date, $time) {
    $query->whereDate('published_at', '=', $date)
    ->whereTime('published_at', '<=', $time);
  });
}
6bc51xsx

6bc51xsx6#

我的逻辑是这样的:如果比较日期,则方法应为whereDate;如果比较的是完整的日期时间,则方法将仅为where:

$calendar_alert = DB::table('calendar_alerts')->whereDate('when', '=', now()->format('Y-m-d'))->where('when', '>', now()->format('H:i:s'))->get();
ubof19bj

ubof19bj7#

如果你还在想怎么解决。
我使用
where('aired', '>=', time());
在我的模型和我的我在哪里做
where('aired', '>=', time());
所以只要用unix来比较在哪里。
另一方面,在视图中,您必须使用日期对象。

pbwdgjma

pbwdgjma8#

面对同样的问题,我建议阅读这篇文章:https://dev.to/nicolus/how-to-properly-retrieve-laravel-models-between-two-dates-1bek
请注意语句:
这里的问题是created_at列通常是一个日期时间,所以它不是一个简单的日期,而是还有一个时间。这意味着在实践中,任何在30日创建的帖子都不会被检索到,因为它们的创建日期总是大于2021-06-30(SQL将假设其表示'2021-06-30 00:00:00')。
...从这篇文章是不完全正确的,因为在我这边,我测试了一个直接比较mysql“日期”类型的字段和一个字符串格式像“2022-10-18”,和问题是一样的,“〈=”没有工作的权利.

相关问题