首页 / 日期
TO_CHAR 日期转字符串
TO_CHAR 把日期或数值转成字符串。MaxCompute、Hologres 和 Spark 同名可用,其他引擎改用 DATE_FORMAT。最大的坑是格式符:MaxCompute 的 mm 表示月、mi 表示分钟,Java 风格的格式中 MM 才是月、mm 是分钟。
格式字符串可以用日期格式符转换器换算成各引擎的写法。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | TO_CHAR(date, format) | 格式符为 yyyy、mm、dd、hh、mi、ss,也支持 %Y、%m 这类写法。日期输入时 format 必填。date 为 NULL 时报错,format 为 NULL 时返回 NULL。也可以传入 BIGINT、DOUBLE 等数值,直接转成字符串。 | 官方文档 |
| Hologres | 支持 | TO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS') | 格式符沿用 PostgreSQL 风格。HH 默认是 12 小时制,24 小时制要写 HH24。默认只支持 1925~2282 年。 | 官方文档 |
| StarRocks | 需改写 | DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') | 没有 TO_CHAR。DATE_FORMAT 使用 MySQL 风格格式符,%i 表示分钟。结果超过 128 字节时返回 NULL。 | 官方文档 |
| Doris | 需改写 | DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') | 没有 TO_CHAR。DATE_FORMAT 使用 MySQL 风格格式符。 | 官方文档 |
| Hive | 需改写 | date_format(ts, 'yyyy-MM-dd HH:mm:ss') | 内置函数中没有 TO_CHAR。date_format 使用 Java 风格格式符。 | 官方文档 |
| Spark SQL | 支持 | to_char(expr, format) | Spark 3.4.0 起提供。4.0 文档写明 expr 可以是日期时间,此时 format 使用 Java 风格格式符;更早的版本请按所用版本文档确认。也可以直接用 date_format。 | 官方文档 |
| Flink SQL | 需改写 | DATE_FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss') | 没有 TO_CHAR。DATE_FORMAT 的格式符兼容 Java SimpleDateFormat。 | 官方文档 |
迁移注意事项
- MaxCompute 的 'yyyy-mm-dd' 原样搬到 Hive、Spark 或 Flink,mm 会被当成分钟,结果类似 2026-30-14,而且不会报错。Java 风格要写 'yyyy-MM-dd'。
- Hologres 的 HH 默认是 12 小时制,下午 3 点会输出 03。需要 24 小时制时写 HH24。
- StarRocks 和 Doris 的分钟是 %i,不是 %M。%M 表示英文月份名。
- MaxCompute 的 TO_CHAR 遇到 date 为 NULL 会报错,而不是返回 NULL。
示例
把下单时间格式化为 yyyy-mm-dd hh:mi:ss
SELECT TO_CHAR(order_time, 'yyyy-mm-dd hh:mi:ss') FROM orders;SELECT TO_CHAR(order_time, 'YYYY-MM-DD HH24:MI:SS') FROM orders;SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') FROM orders;SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') FROM orders;SELECT date_format(order_time, 'yyyy-MM-dd HH:mm:ss') FROM orders;SELECT date_format(order_time, 'yyyy-MM-dd HH:mm:ss') FROM orders;SELECT DATE_FORMAT(order_time, 'yyyy-MM-dd HH:mm:ss') FROM orders;