You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:01:10