我想通过一个表达式从一个表中获取所有行:
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 的等价物是什么?
最佳答案
Laravel 4+ 为您提供了这些方法:whereDay()
、whereMonth()
、whereYear()
(#3946) 和 whereDate()
(#6879)。
他们为您执行 SQL DATE()
工作,并管理 SQLite 的差异。
你的结果可以这样实现:
->whereDate('date', '<=', '2014-07-10')
更多示例,请参见 #3946 的第一条消息这个Laravel Daily article .
更新: 虽然上述方法很方便,但正如 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)
注意事项:
- 23:59:59 可以(暂时)因为 1 秒的精度,但请看这篇文章:23:59:59 is not the end of the day. No, really!
- 请记住“零日期”情况(“0000-00-00 00:00:00”)。尽管应该避免这些“零日期”,但它们是许多问题的根源。如果需要,最好使该字段可以为空。
关于php - Laravel Eloquent 比较日期时间字段中的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139948/