如何用SQL将‘yyyy-wk’格式值转换为上周周一的日期?
将'yyyy-wk'格式转换为上周周一日期的SQL实现
以下针对不同SQL方言,分别给出单个值和列值场景的实现逻辑,核心思路是先解析yyyy-wk得到对应周的周一,再往前推7天得到上周周一。
MySQL/MariaDB
单个值场景
SELECT DATE_FORMAT(DATE_SUB(STR_TO_DATE('2022-41', '%X-%v'), INTERVAL 7 DAY), '%Y-%m-%d') AS last_week_monday;
列值场景(假设列名为week_col,表名为your_table)
SELECT DATE_FORMAT(DATE_SUB(STR_TO_DATE(week_col, '%X-%v'), INTERVAL 7 DAY), '%Y-%m-%d') AS last_week_monday FROM your_table;
说明:%X-%v是MySQL中对应ISO年周的格式(周一为每周起始),STR_TO_DATE将字符串转为该周的周一,DATE_SUB减去7天得到上周周一,最后用DATE_FORMAT格式化输出目标格式。
PostgreSQL
单个值场景
SELECT to_char(to_date('2022-41', 'IYYY-IW') - INTERVAL '7 days', 'YYYY-MM-DD') AS last_week_monday;
列值场景
SELECT to_char(to_date(week_col, 'IYYY-IW') - INTERVAL '7 days', 'YYYY-MM-DD') AS last_week_monday FROM your_table;
说明:IYYY-IW是PostgreSQL的ISO年周格式,to_date解析后得到该周周一,减去7天得到上周周一,to_char完成格式转换。
SQL Server
单个值场景
SET DATEFIRST 1; -- 设置周一为每周第一天 SELECT FORMAT(DATEADD(week, -1, DATEADD(week, CAST(RIGHT('2022-41', 2) AS INT)-1, DATEFROMPARTS(LEFT('2022-41', 4), 1, 1))), 'yyyy-MM-dd') AS last_week_monday;
列值场景
SET DATEFIRST 1; SELECT FORMAT(DATEADD(week, -1, DATEADD(week, CAST(RIGHT(week_col, 2) AS INT)-1, DATEFROMPARTS(LEFT(week_col, 4), 1, 1))), 'yyyy-MM-dd') AS last_week_monday FROM your_table;
说明:先通过SET DATEFIRST 1指定周一为周起始,拆分yyyy-wk的年和周数后计算对应周的周一,再减一周得到上周周一,FORMAT用于格式化输出。
Oracle
单个值场景
SELECT TO_CHAR(TO_DATE('2022-41', 'YYYY-IW') - 7, 'YYYY-MM-DD') AS last_week_monday FROM DUAL;
列值场景
SELECT TO_CHAR(TO_DATE(week_col, 'YYYY-IW') - 7, 'YYYY-MM-DD') AS last_week_monday FROM your_table;
说明:YYYY-IW是Oracle的ISO年周格式,TO_DATE解析后得到该周周一,减7天得到上周周一,TO_CHAR完成格式转换。
内容的提问来源于stack exchange,提问作者atharva narwane
相关产品推荐
相关产品推荐

