首页/数据/SQL 速查/DATE_FORMAT 与 to_char 格式化
函数速查60 条

DATE_FORMAT 与 to_char 格式化

把日期时间格式化为字符串:MySQL 用 % 占位符,PostgreSQL 用 to_char 模板;两者模板字母含义不同,迁移时逐项核对。

SQL 速查数据更新于 2026-10-13

日期格式化是什么

把日期时间格式化成字符串:MySQL 用 DATE_FORMAT(d, '%Y-%m-%d'),PostgreSQL 用 to_char(d, 'YYYY-MM-DD')。两套模板字母含义不同,是迁移时最容易出错的地方:MySQL 的 %Y 是四位年,PostgreSQL 的 YYYY 才是四位年,Y 在 PostgreSQL 里只表示年份的最后一位。反方向把字符串解析成日期,MySQL 用 STR_TO_DATE,PostgreSQL 用 to_date 与 to_timestamp。格式化后的结果是字符串类型,排序与比较都不再按时间语义处理。

基本信息

MySQL 格式化DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
PostgreSQL 格式化to_char(now(), 'YYYY-MM-DD HH24:MI:SS')
MySQL 常用占位%Y 四位年、%m 月、%d 日、%H 小时、%i 分钟、%s 秒
PostgreSQL 模板YYYY、MM、DD、HH24、MI、SS
字符串转日期MySQL 用 STR_TO_DATE,PostgreSQL 用 to_date 与 to_timestamp
注意格式化后是字符串,排序要按原始时间列

典型使用场景

  • 报表展示:把时间戳格式化成人类可读的日期
  • 生成批次号或文件名前缀:把日期嵌入字符串
  • 按天或按月分组前的取整准备
  • 接口输出:按约定的时间格式返回给前端
  • 数据导出:固定格式便于下游系统解析
  • 解析外部数据:把字符串日期转成日期类型再入库

示例

示例
-- MySQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d')            AS d,        # 2024-05-01
       DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')   AS dt,       # 到秒
       DATE_FORMAT(NOW(), '%Y%m')                AS ym;       # 202405
SELECT STR_TO_DATE('2024-05-01', '%Y-%m-%d');

-- PostgreSQL
SELECT to_char(now(), 'YYYY-MM-DD')              AS d,
       to_char(now(), 'YYYY-MM-DD HH24:MI:SS')   AS dt,
       to_char(now(), 'YYYYMM')                  AS ym;
SELECT to_date('2024-05-01', 'YYYY-MM-DD');

占位符对照

含义MySQLPostgreSQL
四位年%YYYYY
两位月%mMM
两位日%dDD
24 小时制小时%HHH24
分钟%iMI
秒%sSS
月份名(英文)%MMonth
两库的模板字母不能互换:PostgreSQL 里 Y 只取年份最后一位,把 MySQL 的 '%Y-%m' 直接搬过去会得到完全不同的结果。
格式化结果排序会按字符串比较:'2024-5-1' 与 '2024-05-01' 的先后与时间顺序不一致,所以排序务必用原始时间列。
在 WHERE 里对时间列套格式化函数会让索引失效;需要按天筛选用范围条件替代,例如 >= '2024-05-01' AND < '2024-05-02'。

使用要点

  • 格式化统一在展示层做,SQL 里尽量保留原始时间类型
  • 两库模板字母对照表贴在项目文档里,避免迁移时反复查
  • 输出格式与接口文档保持一致,前后端约定唯一格式
  • 需要排序或比较时用原始时间列,不用格式化后的字符串
  • 解析字符串时格式要与数据完全一致,否则报错或得到错误的日期
  • 时区转换放在格式化之前,顺序颠倒会得到偏移的时间

易错点

  • 把 MySQL 的 %Y 写法直接搬到 PostgreSQL,得到的是年份最后一位而非四位年
  • 对格式化后的字符串排序,结果与时间顺序不一致
  • WHERE 里对时间列做格式化导致索引失效,大表查询变慢
  • 解析外部字符串时格式不匹配,静默得到错误的日期值
  • 在展示层以外的地方保留字符串格式的时间,后续时间计算全部要重新解析

数据来源与参考

  • MySQL 8.0 Reference Manual · DATE_FORMAT
  • PostgreSQL Documentation · Data Type Formatting Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌