我想通过一个表达式从表中获取所有行:
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的雄辩术会有什么效果?
hyrbngr71#
Laravel 4+为您提供以下方法:第一个是第二个是第三个,第四个是第三个。它们为您执行SQL DATE()工作,并管理SQLite的差异。你的结果可以这样实现:
DATE()
->whereDate('date', '<=', '2014-07-10')
有关更多示例,请参见#3946的第一条消息和此Laravel Daily article。
**Update:**尽管上述方法很方便,但正如阿尔斯所指出的,它在大型数据集上效率很低,因为必须对每条记录应用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)
备注:
pgx2nnw82#
您是否考虑过使用:
where('date', '<', '2014-08-11')
您应避免在MySQL中对索引列使用DATE()函数,因为这会阻止引擎使用索引.
更新
由于对DATE()和索引的重要性似乎存在一些分歧,我创建了一个小提琴来演示它们的区别,请参见POSSIBLE KEYS。
POSSIBLE KEYS
sdnqo3pr3#
您可以从以下语法中选择一种,获取日期为“2016-07-14”或"2016-07-14“之前的所有记录:
->whereDate('date','=','2014-07-10') ->whereDate('date', '<=', '2014-07-10')
或使用动态日期的另一个代码
whereDate('date',$date)
bwitn5fc4#
你可以用这个
whereDate('date', '=', $date)
如果给予whereDate,则只比较日期时间字段中日期
kknvjkwl5#
use Carbon\Carbon; public function scopePublished($query) { $now = Carbon::now(); $date = Carbon::parse($now)->toDateString(); $time = Carbon::parse($now)->toTimeString(); return $query->whereDate('published_at', '<', $date) ->orWhere(function($query) use ($date, $time) { $query->whereDate('published_at', '=', $date) ->whereTime('published_at', '<=', $time); }); }
6bc51xsx6#
我的逻辑是这样的:如果比较日期,则方法应为whereDate;如果比较的是完整的日期时间,则方法将仅为where:
$calendar_alert = DB::table('calendar_alerts')->whereDate('when', '=', now()->format('Y-m-d'))->where('when', '>', now()->format('H:i:s'))->get();
ubof19bj7#
如果你还在想怎么解决。我使用where('aired', '>=', time());在我的模型和我的我在哪里做where('aired', '>=', time());个所以只要用unix来比较在哪里。另一方面,在视图中,您必须使用日期对象。
where('aired', '>=', time());
pbwdgjma8#
面对同样的问题,我建议阅读这篇文章:https://dev.to/nicolus/how-to-properly-retrieve-laravel-models-between-two-dates-1bek请注意语句:这里的问题是created_at列通常是一个日期时间,所以它不是一个简单的日期,而是还有一个时间。这意味着在实践中,任何在30日创建的帖子都不会被检索到,因为它们的创建日期总是大于2021-06-30(SQL将假设其表示'2021-06-30 00:00:00')。...从这篇文章是不完全正确的,因为在我这边,我测试了一个直接比较mysql“日期”类型的字段和一个字符串格式像“2022-10-18”,和问题是一样的,“〈=”没有工作的权利.
8条答案
按热度按时间hyrbngr71#
Laravel 4+为您提供以下方法:第一个是第二个是第三个,第四个是第三个。
它们为您执行SQL
DATE()
工作,并管理SQLite的差异。你的结果可以这样实现:
有关更多示例,请参见#3946的第一条消息和此Laravel Daily article。
**Update:**尽管上述方法很方便,但正如阿尔斯所指出的,它在大型数据集上效率很低,因为必须对每条记录应用
DATE()
SQL函数,从而丢弃可能的索引。以下是进行比较的一些方法(但请阅读下面的注解):
备注:
pgx2nnw82#
您是否考虑过使用:
您应避免在MySQL中对索引列使用
DATE()
函数,因为这会阻止引擎使用索引.更新
由于对
DATE()
和索引的重要性似乎存在一些分歧,我创建了一个小提琴来演示它们的区别,请参见POSSIBLE KEYS
。sdnqo3pr3#
您可以从以下语法中选择一种,获取日期为“2016-07-14”或"2016-07-14“之前的所有记录:
或使用动态日期的另一个代码
bwitn5fc4#
你可以用这个
如果给予whereDate,则只比较日期时间字段中日期
kknvjkwl5#
6bc51xsx6#
我的逻辑是这样的:如果比较日期,则方法应为whereDate;如果比较的是完整的日期时间,则方法将仅为where:
ubof19bj7#
如果你还在想怎么解决。
我使用
where('aired', '>=', time());
在我的模型和我的我在哪里做
where('aired', '>=', time());
个所以只要用unix来比较在哪里。
另一方面,在视图中,您必须使用日期对象。
pbwdgjma8#
面对同样的问题,我建议阅读这篇文章:https://dev.to/nicolus/how-to-properly-retrieve-laravel-models-between-two-dates-1bek
请注意语句:
这里的问题是created_at列通常是一个日期时间,所以它不是一个简单的日期,而是还有一个时间。这意味着在实践中,任何在30日创建的帖子都不会被检索到,因为它们的创建日期总是大于2021-06-30(SQL将假设其表示'2021-06-30 00:00:00')。
...从这篇文章是不完全正确的,因为在我这边,我测试了一个直接比较mysql“日期”类型的字段和一个字符串格式像“2022-10-18”,和问题是一样的,“〈=”没有工作的权利.