如何在 Eloquent 的日期时间列的时间上使用聚合函数?

Posted

技术标签:

【中文标题】如何在 Eloquent 的日期时间列的时间上使用聚合函数?【英文标题】:How to use aggregate functions on the time of a datetime column with Eloquent? 【发布时间】:2019-10-25 15:14:43 【问题描述】:

我有以下 SQL 表:

|----------------------------------------------------------| |课程 | |------------------------------------|----------| | BEGIN_DATE(日期时间)| END_DATE(日期时间)| |------------------------------------|----------| | 2019-04-22 10:00:00 | 2019-04-22 12:00:00 | | 2019-04-23 09:00:00 | 2019-04-23 10:00:00 |

使用 Laravel Eloquent,我想获取 BEGIN_DATE 列的所有课程的最小小时数,以及 END_DATE 列的最大小时数。 在这种情况下,我希望09:00:00 用于最短时间,12:00:00 用于最长时间。

我首先尝试了Lesson::min('begin_date')Lesson::max('end_date'),但它显然返回了最小和最大日期时间,而不是时间。

我也试过

Lesson::select('select cast(begin_datetime as time)')
    ->where('season_id', $this->id)->min(time);

但我得到一个 SQL 错误:

'COLUMN NOT FOUND` 用于时间别名。

另外,我更喜欢仅使用 Eloquent 的解决方案,不使用 SQL

我该怎么做?

【问题讨论】:

【参考方案1】:

你可以这样做:

$data = Lesson::selectRaw(
            'min(TIME(begin_date)) as min_time, max(TIME(end_date)) as max_time'
        )
        ->first()
        ->toArray();

这应该返回如下内容:

dd($data);
=> [
     "min_time" => "09:00:00",
     "max_time" => "12:00:00",
   ]

我还希望看到一个 Eloquent 方法(尝试过但失败了,哈哈)。我希望这会有所帮助。

【讨论】:

完美!非常感谢。

以上是关于如何在 Eloquent 的日期时间列的时间上使用聚合函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel Eloquent 更新 PostgresQL 中 jsonb 列的多个“键”

如何在 Laravel Eloquent 上过滤相关模型

Laravel - 使用 eloquent 在开始日期和结束日期之间选择行

Eloquent - 按“从日期”到“至今”分组,间隔为 1 天

如何在 laravel 的 eloquent 中转换表列数据?

如何将所有日期格式转换为日期列的时间戳?