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

SQL将yyyy/mm/dd日期转yyyy/mm格式 解决单数字月份排序问题(兼容主流DBMS)

问题说明

需求为将datetime类型存储的yyyy/mm/dd格式日期,转换为仅保留年、月维度的yyyy/mm格式,要求方案兼容所有现代DBMS。
原有拼接方案的缺陷:通过日期提取函数拿到的月份为数值类型,1-9月返回单数字无前置0,字符串排序时会出现2010/1排在2010/11之后的逻辑错误。
原有测试SQL:

select *,
concat(date_part('year' , date_old), '/', date_part('month' , date_old)) as date_new
from table 

原有错误返回示例:

date_olddate_new
2010-01-202010/1
2010-01-222010/1
2010-11-222010/11

解决方案

全现代DBMS通用兼容方案

不依赖各数据库独有的格式化函数,通过标准SQL的条件判断给小于10的月份补前置0,所有支持标准SQL的数据库(PostgreSQL、MySQL、SQL Server、BigQuery等)均可直接运行,若当前DBMS的日期部分提取函数名有差异,替换为对应函数即可,核心补零逻辑通用:

select *,
concat(
  date_part('year', date_old),
  '/',
  case when date_part('month', date_old) < 10 then '0' else '' end,
  date_part('month', date_old)
) as date_new
from your_table

PostgreSQL专属简洁写法

PostgreSQL原生提供to_char日期格式化函数,直接指定YYYY/MM格式即可输出固定两位月份的结果,写法更简洁:

select *,
to_char(date_old, 'YYYY/MM') as date_new
from your_table

修正后返回结果

两种方案输出结果一致,月份固定为两位,字符串排序结果和时间逻辑排序完全匹配,不会出现排序混乱问题:

date_olddate_new
2010-01-202010/01
2010-01-222010/01
2010-11-222010/11

内容的提问来源于stack exchange,提问作者Adithya Jayaram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:57:11