WEEKOFYEAR

WEEKOFYEAR函数用于返回日期date所在年的第几周,并支持通过date_part参数指定一周的起始时间。

命令格式

BIGINT|INT WEEKOFYEAR (STRING|DATETIME|DATE|TIMESTAMP|TIMESATMP_NTZ <date> [, STRING <date_part>])

-- 标准示例。
-- 返回13。
SELECT WEEKOFYEAR(DATE '2025-03-31','week(monday)');

参数说明

  • date:必填。STRING、DATETIME、DATE、TIMESTAMPTIMESTAMP_NTZ类型日期值

    当输入为STRING类型时,日期值格式为yyyy-mm-dd hh:mi:ss。在Hive兼容数据类型版本下,日期格式为yyyy-mm-dd不支持指定date_part参数。

  • date_part:选填。STRING类型。支持取值isoweek 、weekweek(weekday) 。

    时间单位

    取值

    • week:以周一为一周的第一天,等效于week(monday)

    • week(weekday):以指定的星期几(weekday)为一周的第一天。

      有效取值:周日(SUNDAY)、周一(MONDAY)、周二(TUESDAY)、周三(WEDNESDAY)、周四(THURSDAY)、周五(FRIDAY)以及周六(SATURDAY)。

    ISO

    isoweek采用ISO 8601所规定的周边界。ISO标准下的周从周一开始算起。

    当未通过date_part指定周的起始时间时,系统判断规则如下:

    • 默认周一作为一周的第一天。

    • 判断当年的11日是上一年最后一周还是这一年第一周,取决于这一周的大多数日期(4天及以上)在哪一年。

返回值说明

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

  • 输入日期值为DATETIME类型时,返回BIGINT类型。

  • 输入日期值为STRING类型时,Hive兼容数据类型版本会返回INT类型,非Hive兼容模式下返回BIGINT类型。

  • 输入日期值为DATE、TIMESTAMPTIMESTAMP_NTZ类型时,返回INT类型。

  • 输入日期值非STRING、DATETIME、DATE、TIMESTAMPTIMESTAMP_NTZ类型时,返回报错。

  • STRING类型日期值格式不符合要求时,返回NULL。

  • 输入的日期值为NULL时,返回NULL。

使用示例

  • 示例1:跨年跨周周归属判断。

    当未指定date_part参数时,若日期位于年末或年初,系统会根据“该周多数日期所在年份”决定其周归属。

    -- 返回52。
    SELECT WEEKOFYEAR(TO_DATE('20241229', 'YYYYMMDD'));
    
    -- 2025-12-29 所在周起始于2025-12-29(周一),结束于2026-01-04 → 多数日期(后四天)在2026年 → 属于2026年第1周。
    -- 返回1。
    SELECT WEEKOFYEAR(TO_DATE('20251229', 'YYYYMMDD'));
    
    -- 2026-01-01 已进入新年,且所在周多数日期在2026年 → 属于2026年第1周。
    -- 返回1。
    SELECT WEEKOFYEAR(TO_DATE('20260101', 'YYYYMMDD'));
    
  • 示例2:不同周起始规则的影响。

    通过date_part参数指定一周的起始日,影响周编号结果。

    -- MaxCompute1.0数据类型不支持DATE。需打开MaxCompute2.0数据类型传参。
    SET odps.sql.type.system.odps2=true;
    -- 默认以周一为起点,且第一周必须包含当年至少4天。
    -- 返回14。
    SELECT WEEKOFYEAR(DATE '2025-03-31');
    
    -- 明确设置从周一(monday)开始计算周。
    -- 返回13。
    SELECT WEEKOFYEAR(DATE '2025-03-31','week(monday)');
    
    -- 以周日(sunday)为一周起点。
    -- 返回13。
    SELECT WEEKOFYEAR(DATETIME '2025-03-31 10:32:00','week(sunday)');
    
    -- 以周五(friday)为一周起点。
    -- 返回13。
    SELECT WEEKOFYEAR(TIMESTAMP_NTZ '2025-03-31 10:32:00.123','week(friday)');
  • 示例3:ISO标准周计算。

    使用 isoweek 遵循ISO 8601标准,每周从周一始,且第一周必须包含当年至少4天。

    -- MaxCompute1.0数据类型不支持DATE。需打开MaxCompute2.0数据类型传参。
    SET odps.sql.type.system.odps2=true;
    -- 按 ISO 周标准,2025-01-06 属于第2周。
    -- 返回2。
    SELECT WEEKOFYEAR(DATE '2025-01-06','isoweek');
  • 示例4:多种时间类型输入支持。

    -- 输入为 DATETIME 类型。
    -- 返回1。
    SELECT WEEKOFYEAR(DATETIME '2025-01-05 10:32:00');
    
    -- 返回0。
    SELECT WEEKOFYEAR(DATETIME '2025-01-05 10:32:00','week(monday)');
    
    -- 输入为标准日期格式字符串。
    -- 返回27。
    SELECT WEEKOFYEAR('2025-07-01 12:30:15');
    
    -- MaxCompute1.0数据类型不支持TIMESTAMP。需打开MaxCompute2.0数据类型传参。
    SET odps.sql.type.system.odps2=true;
    -- 输入为 TIMESTAMP 类型。
    -- 返回30。
    SELECT WEEKOFYEAR(TIMESTAMP '2025-07-21 00:30:15.123');
  • 示例5:异常与边界输入处理。

    -- 字符串格式不符合 yyyy-mm-dd hh:mi:ss,无法解析。
    -- 返回NULL。
    SELECT WEEKOFYEAR('20141231');
    
    -- 返回NULL。
    SELECT WEEKOFYEAR(NULL);

相关函数

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