基于月份和周数列生成日期并分配给WTG的SQL查询需求
解决方案
首先明确假设的表结构(若你的表结构不同,可对应调整字段名):
table1: 包含wtg_id(WTG唯一标识)、target_month(目标月份,格式如YYYY-MM)table2: 包含week_code(月周编码,值为W1/W2/W3/W4/W5)
核心逻辑
- 将月周编码转换为对应日期:
- W1 → 当月7日
- W2 → 当月14日
- W3 → 当月21日
- W4 → 当月28日
- W5 → 当月最后一天
- 按WTG和月周的顺序匹配分配
MySQL 实现示例
SELECT t1.wtg_id, t1.target_month, t2.week_code, -- 转换月周为对应日期 CASE WHEN t2.week_code = 'W1' THEN STR_TO_DATE(CONCAT(t1.target_month, '-07'), '%Y-%m-%d') WHEN t2.week_code = 'W2' THEN STR_TO_DATE(CONCAT(t1.target_month, '-14'), '%Y-%m-%d') WHEN t2.week_code = 'W3' THEN STR_TO_DATE(CONCAT(t1.target_month, '-21'), '%Y-%m-%d') WHEN t2.week_code = 'W4' THEN STR_TO_DATE(CONCAT(t1.target_month, '-28'), '%Y-%m-%d') WHEN t2.week_code = 'W5' THEN LAST_DAY(STR_TO_DATE(t1.target_month, '%Y-%m')) END AS week_date FROM -- 给WTG按顺序编号 (SELECT *, ROW_NUMBER() OVER (ORDER BY wtg_id) AS wtg_seq FROM table1) t1 JOIN -- 给月周按顺序编号(保证W1-W5的顺序) (SELECT *, CASE week_code WHEN 'W1' THEN 1 WHEN 'W2' THEN 2 WHEN 'W3' THEN 3 WHEN 'W4' THEN 4 WHEN 'W5' THEN 5 END AS week_seq FROM table2 ORDER BY week_seq) t2 -- 按顺序匹配分配;若WTG数量多于月周数,改为MOD(wtg_seq-1,5)+1实现循环分配 ON t1.wtg_seq = t2.week_seq;
其他数据库适配说明
- PostgreSQL:
- 替换
STR_TO_DATE为TO_DATE,LAST_DAY替换为(DATE_TRUNC('month', TO_DATE(t1.target_month, 'YYYY-MM')) + INTERVAL '1 month - 1 day')::date
- 替换
- SQL Server:
- 替换
STR_TO_DATE为CONVERT(DATE, CONCAT(t1.target_month, '-07')),LAST_DAY替换为EOMONTH(CONVERT(DATE, CONCAT(t1.target_month, '-01')))
- 替换
注意事项
- 若需要循环分配(WTG数量超过5个时重复W1-W5日期),将JOIN条件改为
MOD(t1.wtg_seq-1,5)+1 = t2.week_seq - 确保
target_month格式统一,避免日期转换报错 - 若table2中月周编码不完整,需补充完整的W1-W5记录后再关联
内容的提问来源于stack exchange,提问作者MDJ
相关产品推荐
相关产品推荐

