广告位 · 页头(后台-模块管理-新建模块后替换此区域)

YEAR函数怎么提取年份?从日期中提取年份的具体实现

在处理销售流水、考勤记录或项目排期表时,日期列通常同时包含年、月、日三个部分,而分析报表往往只需要按照年度维度进行汇总。手工从日期里拆分年份不仅效率低,还容易在复制公式时产生偏移错误。YEAR函数正是为了解决这类需求而设计的日期函数,它可以从一个完整的日期值中直接返回四位数的年份整数。下面先介绍它在Excel中的基础用法,再扩展到SQL和常见编程语言里的对应实现。

YEAR函数怎么提取年份?从日期中提取年份的具体实现

一、Excel中YEAR函数的基础语法与参数说明

Excel中的YEAR函数语法非常简单,官方定义为YEAR(serial_number),其中serial_number参数可以是包含日期的单元格引用、日期序列号,也可以是能够返回日期值的其他函数公式。YEAR函数会返回一个介于1900到9999之间的整数,这个整数就是日期对应的年份。如果参数为空白单元格或无法被识别为日期,公式会返回#VALUE!错误。

需要特别说明的是Excel的日期存储机制。在Windows版Excel的默认1900日期系统中,日期被转换成从1900年1月1日开始计数的序列号,例如1900年1月1日对应序列号1,而2024年5月16日对应的序列号是45458。YEAR函数在底层先读取这个序列号,再根据日期系统还原出年份。因此,即使单元格中显示为日期格式,函数实际处理的仍然是数字。直接输入=YEAR(45458)同样可以得到2024,但这种方式可读性较差,日常使用建议引用日期单元格。

下面给出几个常见公式。第一个公式直接引用A2单元格中的日期;第二个公式使用DATE函数先构造日期,再交给YEAR提取年份;第三个公式处理文本类型的日期,先通过DATEVALUE函数把文本转为真正的日期值,避免因单元格格式为文本而导致公式失败。

=YEAR(A2)
=YEAR(DATE(2024,5,16))
=YEAR(DATEVALUE("2024-05-16"))

如果工作表中已经有一列完整日期,可以把公式向下填充,生成年份辅助列。比如A2为2024-05-16,B2输入=YEAR(A2),返回2024。若A列存在空单元格,建议先用IF函数做判断,避免错误值干扰后续统计。

日期公式结果
2024-05-16=YEAR(A2)2024
2023-11-02=YEAR(A3)2023
2022-09-08=YEAR(DATEVALUE(A4))2022

二、YEAR函数与日期函数组合提取年份

单独使用YEAR函数只能处理现成的日期值,实际工作中经常需要先从文本或其他结构中拼出日期,再进行年份提取。以18位身份证号为例,出生日期位于第7到14位,其中第7到10位是出生年份,第11到12位是月份,第13到14位是日。可以先使用MID函数截取这三段字符串,再用DATE函数转换为标准日期,最后由YEAR返回出生年份。完整公式如下:

=YEAR(DATE(MID(A2,7,4),MID(A2,11,2),MID(A2,13,2)))

在需要按年度汇总数据时,YEAR函数还可以与SUMPRODUCT函数配合。假设A列是订单日期,B列是订单金额,要计算2024年总销售额,可以使用条件数组公式。由于SUMPRODUCT天然支持数组运算,不需要按三键结束,直接回车即可返回结果。下面这个公式先用YEAR把A列每个日期转换成年份,再与2024做等值比较,得到一组TRUE和FALSE,与B列金额相乘后求和,就得到了2024年的销售合计。

=SUMPRODUCT((YEAR($A$2:$A$100)=2024)*$B$2:$B$100)

此外,YEAR函数还可以与TODAY或NOW函数组合,自动获取当前系统日期对应的年份。比如=YEAR(TODAY())会随着系统日期变化自动更新,适合制作动态年度标题。如果只做年份标记,也可以把YEAR的返回结果与文本连接起来,例如生成带有“年”字的标签,用于图表或透视表分组。需要注意,连接后得到的是文本类型,如果后续还要参与数值比较,应保持YEAR的原始整数结果。

三、SQL查询中YEAR函数的用法与跨数据库差异

在数据库查询中,年份提取同样是高频需求。不同数据库提供的函数名称和用法并不完全一致。MySQL和SQL Server都内置了YEAR函数,直接作用于日期字段或日期字符串即可返回整数年份。PostgreSQL没有独立的YEAR函数,通常使用EXTRACT(YEAR FROM date)语法;SQLite则需要借助strftime('%Y', date)函数,返回的是字符串类型,而不是整数。Oracle使用EXTRACT(YEAR FROM date),语法与PostgreSQL相似。

下面看一个按年份统计订单量的例子。不同数据库的写法在SELECT和GROUP BY中需要保持同一表达式,否则会因为聚合条件不一致而报错。

-- MySQL / SQL Server
SELECT YEAR(order_date) AS order_year, COUNT(*) AS total_orders
FROM orders
GROUP BY YEAR(order_date);
-- PostgreSQL / Oracle
SELECT EXTRACT(YEAR FROM order_date) AS order_year, COUNT(*) AS total_orders
FROM orders
GROUP BY EXTRACT(YEAR FROM order_date);
-- SQLite
SELECT strftime('%Y', order_date) AS order_year, COUNT(*) AS total_orders
FROM orders
GROUP BY strftime('%Y', order_date);

在查询条件里直接对日期列使用YEAR函数,虽然逻辑直观,但存在性能隐患。因为函数会作用于每一行,数据库无法使用日期列上的常规索引,可能退化为全表扫描。对于大数据量表,建议将年份条件改写成日期范围查询。例如要筛选2024年的订单,可以写成order_date大于等于2024年1月1日并且小于2025年1月1日。这样优化器可以利用索引快速定位数据区间,执行效率通常明显更高。

SELECT *
FROM orders
WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';

跨时区场景下,如果日期字段包含时区信息,YEAR函数通常基于会话时区解析,提取年份时可能与前一个时区发生偏移。这种偏移对统计口径影响较小,但在处理跨年边界订单时需要留意。

四、编程语言中的年份提取方法

在Excel和SQL之外,如果数据需要经过代码处理,Python和JavaScript是最常接触的环境。Python标准库中的datetime模块通过date.year属性获取年份,返回int类型。对于pandas用户,则可以使用Series.dt.year对整列日期进行向量化提取,适合处理CSV或数据库导出的数据表。

JavaScript中,Date对象的getFullYear方法返回四位年份,而getYear已经从标准中废弃,不要使用。下面示例展示了如何从日期字符串中解析并获取年份。

from datetime import datetime
date_str = "2024-05-16"
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
year = date_obj.year
print(year)  # 2024
import pandas as pd
df = pd.DataFrame({"order_date": ["2024-05-16", "2023-11-02"]})
df["order_date"] = pd.to_datetime(df["order_date"])
df["year"] = df["order_date"].dt.year
print(df)
const dateStr = "2024-05-16";
const date = new Date(dateStr);
const year = date.getFullYear();
console.log(year); // 2024

这些编程语言中的年份提取本质上都属于日期解析后的属性读取,和YEAR函数的思路一致。区别在于Excel和SQL更偏向声明式操作,程序员只需指定函数和参数;而Python和JavaScript需要先完成字符串到日期对象的解析,再通过属性或方法获取年份。如果数据源是Excel文件,直接在Excel内用YEAR函数完成年份列会更方便;如果数据已经进入后端处理流程,则适合用语言自带的日期能力统一转换。

广告位 · 文章底部(后台-模块管理替换此区域)