如何用SQL对单元格内MM/DD/YYYY格式日期字符串排序拼接
单个单元格内日期字符串按日期排序的SQL实现
假设你有一个包含逗号分隔日期字符串的字段(示例值:08/01/2022, 06/23/2022,格式为MM/DD/YYYY),需要将其转换为按日期升序排列的逗号分隔字符串(结果:06/23/2022, 08/01/2022),核心思路是拆分字符串→转日期排序→重新合并,以下是主流数据库的具体实现:
MySQL 8.0+ 实现
利用SUBSTRING_INDEX配合数字表拆分字符串,STR_TO_DATE转换为日期类型,最后用GROUP_CONCAT按序合并:
SELECT GROUP_CONCAT(formatted_date ORDER BY parsed_date ASC SEPARATOR ', ') AS sorted_dates FROM ( SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.date_str, ', ', n.n), ', ', -1)) AS formatted_date, STR_TO_DATE(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.date_str, ', ', n.n), ', ', -1)), '%m/%d/%Y') AS parsed_date FROM your_table t CROSS JOIN ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 -- 按实际最大日期数量调整行数 ) n WHERE n.n <= LENGTH(t.date_str) - LENGTH(REPLACE(t.date_str, ', ', '')) + 1 ) split_dates;
SQL Server 2016+ 实现
使用STRING_SPLIT拆分字符串,CONVERT转换为日期类型,通过STRING_AGG带排序合并:
SELECT STRING_AGG(formatted_date, ', ') WITHIN GROUP (ORDER BY parsed_date ASC) AS sorted_dates FROM ( SELECT TRIM(value) AS formatted_date, CONVERT(DATE, TRIM(value), 101) AS parsed_date -- 101对应MM/DD/YYYY格式 FROM your_table CROSS APPLY STRING_SPLIT(date_str, ', ') ) split_dates;
PostgreSQL 实现
借助STRING_TO_ARRAY和UNNEST拆分字符串,TO_DATE转换日期,再用STRING_AGG按序合并:
SELECT STRING_AGG(formatted_date, ', ' ORDER BY parsed_date ASC) AS sorted_dates FROM ( SELECT TRIM(d) AS formatted_date, TO_DATE(TRIM(d), 'MM/DD/YYYY') AS parsed_date FROM your_table, UNNEST(STRING_TO_ARRAY(date_str, ', ')) d ) split_dates;
注意事项
- 替换
your_table和date_str为实际的表名和字段名 - MySQL的数字表需要根据单元格内最大日期数量扩展行数
- 确保所有日期字符串格式统一为MM/DD/YYYY,否则日期转换会报错
内容的提问来源于stack exchange,提问作者Như An
相关产品推荐
相关产品推荐

