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

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

如果使用拉维尔的Eloquent ,会有什么类似功能?

推荐答案

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

他们为您执行SQL DATE(),并管理SQLite的差异.

您的结果可以通过以下方式实现:

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

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


Update: Though the above method is convenient, as noted by Arth it is inefficient on large datasets, because the DATE() SQL function has to be applied on each record, thus discarding the possible index.

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

->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!
  • 请记住"零日期" case ("0000-00-00:00:00").尽管这些"零日期"应该避免,但它们是许多问题的根源.如果需要,最好将字段设置为空.

Mysql相关问答推荐

在SQL中,为什么:=即使条件为False,也会在case声明中执行?我如何修复这个问题?

mysql查询汇总数据

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

在MySQL中使用FIRST_VALUE()

按唯一列排序,但保持匹配的列在一起

替代对多个表执行 FULL OUTER JOIN?

Select 并统计所有条目并根据条目对它们进行分组

错误1075:表定义不正确;只能有一个自动列,它必须定义为一个键(使用 gorm 和 mysql)

如何知道 Select 查询花费了多少时间?

如何通过if语句对SQL查询进行排序

如何查询打印已售罄的产品? [MYSQL]

如何使用 sequelize 将复合主键放在连接表中?

基于两个单元格值的 SQL 过滤表

如何使用 SQL 数据库中的经纬度查找最近的位置?

我的 PDO 声明不起作用

#1030 - 从存储引擎 Aria 收到错误 176读取错误校验和的页面

错误:无法构建 gem 本机扩展(rails 3.2.3 上的 mysql2)

设计用户角色和权限系统的最佳实践?

cron 启动的 mysqldump 和密码安全

在 PHP 中运行 MySQL *.sql 文件