如何用concat生成下一月字段?解决跨年及月份位数问题
解决入职月份下一月的日期格式化与拼接问题
数据表
| employee_id | join_year | join_month | joindatetime | first_name | last_name |
|---|---|---|---|---|---|
| 1 | 2011 | 03 | 2011-03-06 06:00:00 | Mike | Jordan |
| 2 | 2012 | 11 | 2012-11-19 07:00:00 | John | Simpson |
| 31 | 2019 | 12 | 2019-12-05 11:30:00 | Jane | Athur |
需求
拼接生成新列,格式为employee_id-YYYYMMDD-first_name-last_name,其中日期部分为入职月份的下一月1日(12月则跨年到次年1月1日),预期输出:
1-20110401-Mike-Jordan 2-20121201-John-Simpson 31-20200101-Jane-Athur
原代码问题
你之前的代码concat(employee_id,'-',join_year,join_month+1,'01','-',firstname,'-',lastname) as 'WWID'存在两个核心问题:
- 直接对
join_month做+1运算会丢失前导零(比如03变成3),且无法处理12月跨年的逻辑 - 字段名拼写错误:
firstname应为first_name
解决方案
利用日期函数直接计算下一月的第一天,再格式化日期后拼接是最稳妥的方式,主流数据库的实现如下:
MySQL/MariaDB
SELECT CONCAT( employee_id, '-', DATE_FORMAT(DATE_ADD(joindatetime, INTERVAL 1 MONTH), '%Y%m01'), '-', first_name, '-', last_name ) AS WWID FROM your_table_name;
DATE_ADD(joindatetime, INTERVAL 1 MONTH):自动计算入职日期的下一月日期,包含跨年逻辑DATE_FORMAT(..., '%Y%m01'):将日期格式化为YYYYMM01的字符串,自动补全月份前导零
PostgreSQL
SELECT CONCAT( employee_id, '-', TO_CHAR((joindatetime + INTERVAL '1 month'), 'YYYYMM') || '01', '-', first_name, '-', last_name ) AS WWID FROM your_table_name;
(joindatetime + INTERVAL '1 month'):计算下一月日期TO_CHAR(..., 'YYYYMM'):格式化年月后拼接01,得到当月1日的字符串格式
SQL Server
SELECT CONCAT( employee_id, '-', FORMAT(DATEADD(MONTH, 1, joindatetime), 'yyyyMM01'), '-', first_name, '-', last_name ) AS WWID FROM your_table_name;
DATEADD(MONTH, 1, joindatetime):计算下一月日期FORMAT(..., 'yyyyMM01'):直接格式化为指定的日期字符串格式
如果无法使用joindatetime字段,仅通过join_year和join_month计算(以MySQL为例):
SELECT CONCAT( employee_id, '-', DATE_FORMAT(STR_TO_DATE(CONCAT(join_year, '-', join_month, '-01'), '%Y-%m-%d') + INTERVAL 1 MONTH, '%Y%m01'), '-', first_name, '-', last_name ) AS WWID FROM your_table_name;
STR_TO_DATE(CONCAT(join_year, '-', join_month, '-01'), '%Y-%m-%d'):将年、月拼接为标准日期- 后续步骤同日期字段的处理逻辑
内容的提问来源于stack exchange,提问作者futureyoon
相关产品推荐
相关产品推荐

