WEEKOFYEAR函數用於返回日期date所在年的第幾周,並支援通過date_part參數指定一周的起始時間。
命令格式
BIGINT|INT WEEKOFYEAR (STRING|DATETIME|DATE|TIMESTAMP|TIMESTAMP_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函數屬於日期函數,更多日期計算、日期轉換的相關函數請參見日期函數。