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

alm*_*lmo 37 php mysql datetime laravel-4

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

table.date <= 2014-07-10
Run Code Online (Sandbox Code Playgroud)

但如果列包含日期时间,请说:

2014-07-10 12:00:00
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

where('date', '<=', $date)
Run Code Online (Sandbox Code Playgroud)

它不会得到排.

我想这是因为$ date = 2014-07-10这让MySQL假设它是2014-07-10 00:00:00.

在常规MySQL中我会这样做

where DATE(date) <= $date
Run Code Online (Sandbox Code Playgroud)

使用Laravel的Eloquent会等同于什么?

Gra*_*ble 65

Laravel 4+为您提供这些方法:whereDay(),whereMonth(),whereYear()(#3946)和whereDate()(#6879).

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

您的结果可以如下实现:

->whereDate('date', '<=', '2014-07-10')
Run Code Online (Sandbox Code Playgroud)

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


更新:虽然上述方法很方便,但如Arth所述,它在大型数据集上效率低,因为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)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 23:59:59是可以的(现在)因为1秒精度,但看看这篇文章:23:59:59不是一天的结束.不完全是!
  • 请记住"零日期"案例("0000-00-00 00:00:00").虽然应该避免这些"零日期",但它们是许多问题的根源.如果需要,最好使字段可以为空.


Maj*_*bib 7

您可以使用它获取日期“2016-07-14”的所有记录

 whereDate('date','=','2016-07-14')
Run Code Online (Sandbox Code Playgroud)

或者使用另一个代码作为动态日期

whereDate('date',$date)
Run Code Online (Sandbox Code Playgroud)


Art*_*rth 6

你考虑过使用:

where('date', '<', '2014-08-11')
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

  • `:: whereRaw("DATE(date)<='2014-08-10'")`.@Arth他没有提到索引,所以我不知道它的模糊性是什么.@almo`2014-07-10`将像你说的那样被投放到`DATETIME`(`2014-07-10 00:00:00`).但是,你将'DATE`与'DATETIME`进行比较,你要么将'DATETIME`转换为'DATE`,要么将`23:59:59`添加到`$ date`. (2认同)