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)
笔记:
您可以使用它获取日期“2016-07-14”的所有记录
whereDate('date','=','2016-07-14')
Run Code Online (Sandbox Code Playgroud)
或者使用另一个代码作为动态日期
whereDate('date',$date)
Run Code Online (Sandbox Code Playgroud)
你考虑过使用:
where('date', '<', '2014-08-11')
Run Code Online (Sandbox Code Playgroud)
您应该避免DATE()在MySQL中使用索引列上的函数,因为这会阻止引擎使用索引.
UPDATE
由于似乎对DATE()索引的重要性存在一些分歧,我创造了一个演示差异的小提琴,请参阅POSSIBLE KEYS.