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

2022-08-30 09:19:26

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

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的Eloquent会是什么?


答案 1

Laravel 4+为您提供以下方法:,,(#3946)和(#6879)。whereDay()whereMonth()whereYear()whereDate()

他们为您完成SQL工作,并管理SQLite的差异。DATE()

您的结果可以实现如下:

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

有关更多示例,请参阅#3946的第一条消息和这篇Laravel Daily文章


更新:虽然上述方法很方便,但正如Arth所指出的那样,它在大型数据集上效率低下,因为SQL函数必须应用于每条记录,从而丢弃可能的索引。DATE()

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

->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 不是一天的结束。不,真的!
  • 请记住“零日期”情况(“0000-00-00 00:00:00”)。虽然,这些“零日期”应该避免,但它们是许多问题的根源。如果需要,最好使该字段为空。

答案 2

您是否考虑过使用:

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

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

更新

由于似乎对 和 索引 的重要性存在一些分歧,因此我创建了一个演示差异的小提琴,请参阅。DATE()POSSIBLE KEYS


推荐