ISOYEAR

ISOYEAR函数用于从指定日期date中提取对应的ISO 8601年份。

IOS 8601介绍

ISO 8601年份依据ISO周日期系统定义,与公历年份有所不同。具体来说:ISO年份的第一天,是包含该年第一个星期四的那个星期一。示例:

  • 如果11日是星期五、星期六或星期日,那么这一周属于上一个ISO年份的最后一周。

  • 如果11日是星期一至星期三,则这一周属于当前ISO年份的第一周。

这意味着ISO年份可能从公历年的前一周开始,或延续到下一年的第一周结束。这种定义可以确保每个ISO年份都恰好包含5253个完整的星期,便于跨年度的时间计算和规划。

命令格式

INT ISOYEAR(STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ|INTERVAL <date>)

-- 标准示例
-- 返回2025。
SELECT ISOYEAR(DATE '2025-03-12');

参数说明

  • date:必填。待提取ISO年份的日期值。支持DATETIME、TIMESTAMP、TIMESTAMP_NTZ、STRINGINTERVAL类型。

    • STRING类型作为输入参数时,日期格式需包含yyyy-mm-ddyyyy-mm-dd hh:mi:ss

    • INTERVAL类型作为输入参数时,仅支持INTERVAL_YEAR_MONTH,不支持INTERVAL_DAY_TIME。详情参考INTERVAL数据类型

返回值说明

返回INT类型。返回规则如下:

  • dateSTRING、DATE、DATETIME、TIMESTAMP、TIMESTAMP_NTZINTERVAL类型,或格式不符合要求时,返回NULL或报错。

  • date值为NULL时,返回NULL。

使用示例

  • 示例1:基础日期类型的ISO年提取(STRING/DATE/DATETIME/TIMESTAMP/TIMESTAMP_NTZ)。

    -- 开启MaxCompute 2.0数据类型版本。
    SET odps.sql.type.system.odps2 = true;
    
    -- 输入为STRING类型,支持标准日期格式的字符串。
    -- 返回2025。
    SELECT ISOYEAR('2025-03-12 12:22:00.123');
    
    -- 输入为TIMESTAMP类型。
    -- 返回2025。
    SELECT ISOYEAR(TIMESTAMP '2025-03-31 12:43:00');
    
    -- 输入为DATE类型。
    -- 返回2025。
    SELECT ISOYEAR(DATE '2025-01-01');
    
    -- 输入为DATETIME类型。
    -- 返回2024。
    SELECT ISOYEAR(DATETIME '2024-01-01 12:30:00');
    
    -- 输入为TIMESTAMP_NTZ(无时区时间戳),支持微秒精度。
    -- 返回2025。
    SELECT ISOYEAR(TIMESTAMP_NTZ '2025-06-06 12:43:00.123');
  • 示例2:INTERVAL_YEAR_MONTH 类型作为直接输入。

    -- 开启MaxCompute 2.0数据类型版本。
    SET odps.sql.type.system.odps2 = true;
    
    -- 输入为12个月的时间间隔,表示从基准年起第1年。
    -- 返回1。
    SELECT ISOYEAR(INTERVAL '1-2' YEAR TO MONTH);
    
    -- 输入INTERVAL '14' MONTH 等价于INTERVAL '1-2' YEAR TO MONTH。
    -- 返回1。
    SELECT ISOYEAR(INTERVAL '14' MONTH);
  • 示例3:日期与INTERVAL组合运算后的ISO年计算(算术表达式)。

    -- 开启MaxCompute 2.0数据类型版本。
    SET odps.sql.type.system.odps2 = true;
    
    -- 起始日期2023-01-01 加上12个月 → 得到2024-03-01 → 属于ISO 2024年。
    -- 返回2024。
    SELECT ISOYEAR(DATE '2023-01-01' + INTERVAL '1-2' YEAR TO MONTH);
    
    -- 减去9年 → 得到2014-01-01 → 该日为星期三 → 属于ISO 2014年第1周。
    -- 返回2014。
    SELECT ISOYEAR(DATE '2023-01-01' + INTERVAL '-9' YEAR);
    
    -- 加11个月 → 得到2023-12-01 → 属于ISO 2023年。
    -- 返回2023。
    SELECT ISOYEAR(DATE '2023-01-01' + INTERVAL '11' MONTH);
  • 示例4:跨年临界点的ISO年边界判断。

    -- 开启MaxCompute 2.0数据类型版本。
    SET odps.sql.type.system.odps2 = true;
    
    -- 20230101日是星期日,属于2022年的最后一周。
    -- 返回2022。
    SELECT ISOYEAR(DATETIME '2023-01-01 12:30:00');
    
    -- 20241230日是星期一,属于2025年的第一周。
    -- 返回2025。
    SELECT ISOYEAR('2024-12-30');
    
    -- 20250101日是星期三,属于2025年的第一周。
    -- 返回2025。
    SELECT ISOYEAR('2025-01-01 00:00:00');
  • 示例5:NULL值输入处理。

    -- date值为NULL时,返回NULL。
    SELECT ISOYEAR(NULL);

相关函数

ISOYEAR函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数