MySQl:如何对日期格式的列进行分组(“年”),而忽略月和日

时间:2018-10-04 07:07:52

标签: mysql laravel-5 eloquent

我正在使用Laravel构建应用程序。我正在使用Eloquent和MySql数据库。在我的MySQL数据库中,有一个这样的表EVENTS:

id  EVENT   YEAR
1   event1  2000-05-27
2   event2  2018-01-01
3   event3  2000-02-12
4   event4  2000-06-03

此示例仅是为了简单起见,显然我的数据库随时都有数百个事件发生。

年份栏中的数据具有“日期”格式

我需要从此MySQL表中获取每年发生的事件的履历表。在示例中将是

year    number of events
2000    3
2018    1

我这样做了:

$years = Event::groupBy('year')
                    ->selectRaw('count(*) as total, year')
                    ->get();

我明白了:

year    number of events
2000    1
2018    1
2000    1
2000    1

因为该列中的每个日期都不相同(在示例表中:2000-02-12!== 2000-06-03!== 2000-05-27)。

我需要将每年发生的所有事件归为一类,而不必考虑mont和day。

问题是:

即使事件在不同的日期和月份发生,我如何按列“年份”进行分组,但仅考虑年份?

3 个答案:

答案 0 :(得分:1)

由于您使用了selectRaw,因此只需将日期转换为年份,即可像普通查询一样进行分组。

$years = Event::selectRaw('count(*) as total, YEAR(year) as year')
    ->groupBy('year')
    ->get();

答案 1 :(得分:1)

这是使用DATE_FORMAT的替代方法:

$years = Event::selectRaw("DATE_FORMAT(YEAR, '%Y') AS year, COUNT(*) AS total")
    ->groupBy('year')
    ->get();

DATE_FORMAT比使用YEAR()功能更灵活,并且可以轻松地使我们在一个列中按年和月分组。

答案 2 :(得分:0)

您可以尝试这个

$event = Event::selectRaw('count(*) as yearTotal, YEAR(year) as yearName')->groupBy(\DB::raw('YEAR(year)'))->get();