日期格式符转换器
各数仓引擎的日期格式符分成四种写法,迁移时很容易把月和分钟、12 小时制和 24 小时制写混。输入一个格式字符串,下面会列出每个引擎的写法,并标出容易出错的地方。
按示例时间 2026-03-05 14:07:09.123456(星期四) 输出:2026-03-05 14:07:09
| 引擎 | 格式符 | 格式化 | 解析字符串 | 提示 |
|---|---|---|---|---|
| MaxCompute | yyyy-mm-dd hh:mi:ss | TO_CHAR(dt, 'yyyy-mm-dd hh:mi:ss') | TO_DATE(str, 'yyyy-mm-dd hh:mi:ss') | DATE_FORMAT 开启 Hive 兼容模式后使用 Java 风格。 |
| Hologres | YYYY-MM-DD HH24:MI:SS | TO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS') | TO_TIMESTAMP(str, 'YYYY-MM-DD HH24:MI:SS') | |
| StarRocks | %Y-%m-%d %H:%i:%s | DATE_FORMAT(dt, '%Y-%m-%d %H:%i:%s') | STR_TO_DATE(str, '%Y-%m-%d %H:%i:%s') | 需要 Java 风格时可以用 jodatime_format。 |
| Doris | %Y-%m-%d %H:%i:%s | DATE_FORMAT(dt, '%Y-%m-%d %H:%i:%s') | STR_TO_DATE(str, '%Y-%m-%d %H:%i:%s') | |
| Hive | yyyy-MM-dd HH:mm:ss | date_format(ts, 'yyyy-MM-dd HH:mm:ss') | unix_timestamp(str, 'yyyy-MM-dd HH:mm:ss') | Hive 4.0 起可以用 hive.datetime.formatter 切换底层实现,之前固定使用 SimpleDateFormat。 |
| Spark SQL | yyyy-MM-dd HH:mm:ss | date_format(ts, 'yyyy-MM-dd HH:mm:ss') | to_timestamp(str, 'yyyy-MM-dd HH:mm:ss') | Spark 的格式符表里没有 Y、u、w 这几个字母。 |
| Flink SQL | yyyy-MM-dd HH:mm:ss | DATE_FORMAT(ts, 'yyyy-MM-dd HH:mm:ss') | TO_TIMESTAMP(str, 'yyyy-MM-dd HH:mm:ss') | 格式符兼容 Java SimpleDateFormat。 |
四种写法
| 写法 | 引擎 | 例子 |
|---|---|---|
| Java 风格 | Hive、Spark、Flink | yyyy-MM-dd HH:mm:ss |
| MySQL 风格 | StarRocks、Doris | %Y-%m-%d %H:%i:%s |
| PostgreSQL 风格 | Hologres | YYYY-MM-DD HH24:MI:SS |
| MaxCompute 风格 | MaxCompute | yyyy-mm-dd hh:mi:ss |
格式符对照表
示例时间是 2026-03-05 14:07:09.123456(星期四)。MaxCompute 列中带 % 的写法只有 TO_CHAR 支持,TO_DATE 只认 yyyy、mm、dd、hh、mi、ss 和 ff3。
| 含义 | 示例 | Java 风格 | MySQL 风格 | PostgreSQL 风格 | MaxCompute 风格 |
|---|---|---|---|---|---|
| 四位年 | 2026 | yyyy | %Y | YYYY | yyyy |
| 两位年 | 26 | yy | %y | YY | %y |
| 月,补零 | 03 | MM | %m | MM | mm |
| 月,不补零 | 3 | M | %c | FMMM | — |
| 英文月份缩写 | Mar | MMM | %b | Mon | %b |
| 英文月份全称 | March | MMMM | %M | FMMonth | %B |
| 日,补零 | 05 | dd | %d | DD | dd |
| 日,不补零 | 5 | d | %e | FMDD | %e |
| 一年中的第几天 | 064 | DDD | %j | DDD | %j |
| 24 小时制小时,补零 | 14 | HH | %H | HH24 | hh |
| 24 小时制小时,不补零 | 14 | H | %k | FMHH24 | — |
| 12 小时制小时,补零 | 02 | hh | %h | HH12 | %I |
| 12 小时制小时,不补零 | 2 | h | %l | FMHH12 | %l |
| 分钟 | 07 | mm | %i | MI | mi |
| 秒 | 09 | ss | %s | SS | ss |
| 毫秒(3 位) | 123 | SSS | — | MS | ff3 |
| 微秒(6 位) | 123456 | SSSSSS | %f | US | — |
| 上午或下午 | PM | a | %p | AM | %p |
| 英文星期缩写 | Thu | EEE | %a | Dy | %a |
| 英文星期全称 | Thursday | EEEE | %W | FMDay | %A |
常见错误
- 月和分钟:Java 风格中 MM 是月、mm 是分钟;MaxCompute 中 mm 是月、mi 是分钟。把 MaxCompute 的 yyyy-mm-dd 原样用在 Hive、Spark 或 Flink,月份位置会输出分钟,而且不会报错。
- 12 小时制:Java 风格的 hh 是 12 小时制,24 小时制要写 HH。MaxCompute TO_CHAR 中 hh 和 HH 都是 24 小时制。Hologres 的 HH 默认也是 12 小时制,要写 HH24。
- %M 的含义不同:StarRocks 和 Doris 中 %M 是英文月份全称,分钟写 %i;MaxCompute TO_CHAR 中 %M 是分钟。
- YYYY 不是日历年:Java 风格的 YYYY 是按周计算的年份,12 月最后几天可能输出下一年。日历年要写 yyyy。MaxCompute DATE_FORMAT 的文档也有同样的提醒。
- 毫秒和微秒:MySQL 风格没有 3 位毫秒,%f 输出 6 位微秒。Hive 4.0 之前和 Flink 使用 SimpleDateFormat,SSSSSS 输出的是补零的毫秒,不是微秒。
- Hologres 的 Month 和 Day 会用空格补齐到 9 个字符,加 FM 前缀(FMMonth、FMDay)可以去掉多余的空格。
相关函数:DATE_FORMAT · TO_CHAR · TO_DATE · FROM_UNIXTIME · UNIX_TIMESTAMP