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、TIMESTAMP或TIMESTAMP_NTZ类型日期值。
当输入为STRING类型时,日期值格式为
yyyy-mm-dd hh:mi:ss。在Hive兼容数据类型版本下,日期格式为yyyy-mm-dd且不支持指定date_part参数。date_part:选填。STRING类型。支持取值
isoweek、week或week(weekday)。时间单位
取值
周
week:以周一为一周的第一天,等效于week(monday)week(weekday):以指定的星期几(weekday)为一周的第一天。有效取值:周日(SUNDAY)、周一(MONDAY)、周二(TUESDAY)、周三(WEDNESDAY)、周四(THURSDAY)、周五(FRIDAY)以及周六(SATURDAY)。
ISO周
isoweek采用ISO 8601所规定的周边界。ISO标准下的周从周一开始算起。当未通过date_part指定周的起始时间时,系统判断规则如下:
默认周一作为一周的第一天。
判断当年的1月1日是上一年最后一周还是这一年第一周,取决于这一周的大多数日期(4天及以上)在哪一年。
返回值说明
返回BIGINT或INT类型。返回规则如下:
输入日期值为DATETIME类型时,返回BIGINT类型。
输入日期值为STRING类型时,Hive兼容数据类型版本会返回INT类型,非Hive兼容模式下返回BIGINT类型。
输入日期值为DATE、TIMESTAMP或TIMESTAMP_NTZ类型时,返回INT类型。
输入日期值非STRING、DATETIME、DATE、TIMESTAMP或TIMESTAMP_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函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数。