MySQL YEAR() 函数用法与实例

MySQL 中的 YEAR() 函数可以帮助我们从日期或日期时间值中提取年份。

发布于

在日常数据库操作中,我们经常需要从日期数据中提取年份信息进行分析和统计。MySQL 提供的 YEAR() 函数就是专门用于这项任务的利器,它能够从日期或日期时间值中快速提取出年份部分,让基于年份的数据处理变得简单高效。无论是生成年度报表、分析历史趋势,还是进行时间范围筛选,这个函数都能大显身手。

YEAR() 函数基本介绍

YEAR() 函数是 MySQL 中最直观的日期函数之一,它的作用就是从日期或日期时间表达式中提取年份值。这个函数接受一个日期参数,返回一个四位数的年份值,范围从 1000 到 9999。

基本语法非常简单明了:

YEAR(date)

其中 date 参数可以是以下几种类型:

  • DATE 类型的值
  • DATETIME 类型的值
  • TIMESTAMP 类型的值
  • 能被解析为日期的字符串

如果输入的日期不合法或者为 NULL,函数将返回 NULL。

基础用法示例

让我们从最简单的例子开始,了解 YEAR() 函数的基本用法。

获取当前年份:

SELECT YEAR(NOW());

从特定日期提取年份:

SELECT YEAR('2023-07-20');

处理日期时间值:

SELECT YEAR('2023-07-20 14:30:45');

这些查询都会返回相同的年份结果:2023。

实际应用场景

YEAR() 函数在实际业务中有广泛的应用价值,下面我们来看几个典型的使用场景。

筛选特定年份的数据

查询 2022 年的所有订单:

SELECT *
FROM orders
WHERE YEAR(order_date) = 2022;

按年份分组统计

统计每年销售额:

SELECT
    YEAR(order_date) AS order_year,
    SUM(amount) AS total_sales
FROM
    orders
GROUP BY
    order_year
ORDER BY
    order_year;

计算年龄

根据出生日期计算年龄:

SELECT
    name,
    YEAR(CURDATE()) - YEAR(birth_date) AS age
FROM
    employees;

与其他日期函数结合使用

YEAR() 函数经常与其他日期函数配合使用,实现更复杂的日期处理逻辑。

结合 MONTH() 函数使用

按月统计每年的销售情况:

SELECT
    YEAR(order_date) AS order_year,
    MONTH(order_date) AS order_month,
    SUM(amount) AS monthly_sales
FROM
    orders
GROUP BY
    order_year, order_month
ORDER BY
    order_year, order_month;

与 DATE_FORMAT() 函数对比

YEAR()DATE_FORMAT() 获取年份的对比:

SELECT
    YEAR(order_date) AS year_func,
    DATE_FORMAT(order_date, '%Y') AS year_format
FROM
    orders
LIMIT 5;

处理特殊日期情况

在使用 YEAR() 函数时,需要注意一些特殊情况。

处理 NULL 值

当日期字段可能为 NULL 时:

SELECT
    id,
    YEAR(completed_date) AS completion_year
FROM
    projects
WHERE
    YEAR(completed_date) = 2023
    OR completed_date IS NULL;

处理非法日期值

使用 STR_TO_DATE() 处理字符串日期:

SELECT
    YEAR(STR_TO_DATE(date_string, '%m/%d/%Y'))
FROM
    raw_data;

性能优化建议

在大数据量环境下使用 YEAR() 函数时,需要考虑性能优化。

避免在索引列上使用函数

不推荐的写法(会导致索引失效):

SELECT * FROM sales WHERE YEAR(sale_date) = 2023;

推荐的优化写法:

SELECT * FROM sales
WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31';

使用生成列存储年份

MySQL 5.7+ 版本可以使用存储生成列:

ALTER TABLE sales
ADD COLUMN sale_year INT
GENERATED ALWAYS AS (YEAR(sale_date)) STORED;

CREATE INDEX idx_sale_year ON sales(sale_year);

常见问题解答

YEAR() 与 EXTRACT(YEAR FROM date) 的区别

两者功能相同,但 YEAR() 更简洁:

SELECT
    YEAR(NOW()),
    EXTRACT(YEAR FROM NOW());

两位数年份的处理

对于两位数的年份,MySQL 有自动转换规则:

SELECT YEAR('23-07-20');  -- 返回 2023

总结

MySQL 的 YEAR() 函数是一个简单但极其实用的日期处理工具,它能高效地从日期值中提取年份信息,为基于年份的数据分析和统计提供了基础支持。无论是简单的年份筛选,还是复杂的年度报表生成,这个函数都能胜任。在实际使用时,记住考虑性能优化问题,特别是在处理大数据量表时,避免在索引列上直接使用函数。对于需要频繁按年份查询的场景,考虑使用存储生成列来提升查询效率。掌握了 YEAR() 函数的各种应用技巧,您的日期数据处理能力将更上一层楼。