SQL查询如何格式化起止日期为日+3位月份并逗号拼接输出
SQL实现指定格式日期段拼接方案
核心思路
你之前的写法仅截取了开始日期的3位月份缩写,缺失了日字段提取、前后段拼接、分隔符添加、结束日期处理几个环节,要得到目标格式需要按以下步骤处理:
- 分别对
start_date、end_date两个字段做格式化,提取带前导零的两位日期+3位英文月份缩写,两部分用空格连接 - 两个日期的格式化结果用
,(逗号+空格)做分隔拼接,最终别名设为time_period
不同数据库的实现代码
MySQL / MariaDB
直接用内置DATE_FORMAT函数即可,%d对应两位带前导零的日期,%b对应3位英文月份缩写,无需额外截取处理:
SELECT CONCAT( DATE_FORMAT(start_date, '%d %b'), ', ', DATE_FORMAT(end_date, '%d %b') ) AS time_period FROM 你的表名;
针对你给出的样例数据,该语句返回结果完全匹配预期:
- 输入start_date=
2012-03-10 05:57:39.629597、end_date=2022-06-03 05:57:39.629597,输出10 Mar, 03 Jun - 输入start_date=
2010-04-06 05:57:39.629597、end_date=2022-05-20 05:57:39.629597,输出06 Apr, 20 May
PostgreSQL
使用TO_CHAR函数做日期格式化:
SELECT CONCAT( TO_CHAR(start_date, 'DD Mon'), ', ', TO_CHAR(end_date, 'DD Mon') ) AS time_period FROM 你的表名;
SQL Server
使用FORMAT函数时注意指定英文区域,避免返回本地语言的月份缩写:
SELECT CONCAT( FORMAT(start_date, 'dd MMM', 'en-US'), ', ', FORMAT(end_date, 'dd MMM', 'en-US') ) AS time_period FROM 你的表名;
原写法问题说明
你之前使用的SUBSTRING( MONTHNAME(start_date), 1, 3)逻辑仅完成了「提取开始日期3位月份缩写」这一个步骤,既没有提取日字段、处理日期前导零,也没有添加分隔符、拼接结束日期的对应内容,因此无法得到目标格式结果。
内容的提问来源于stack exchange,提问作者Adarsh Srivastav
相关产品推荐
相关产品推荐

