首页 / 日期
TO_DATE 字符串转日期
TO_DATE 在不同引擎里有两种含义:MaxCompute、Hologres、Spark 和 Flink 用它按格式解析字符串;Hive、StarRocks 和 Doris 的 TO_DATE 只取日期部分,不能按格式解析。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | TO_DATE(date_str[, format]) |
不传 format 时返回 DATE,传入 format 时返回 DATETIME。格式符为 yyyy、mm、dd、hh、mi、ss、ff3,format 必须包含 yyyy。 | 官方文档 |
| Hologres | 支持 | TO_DATE(text, format) |
PostgreSQL 风格格式符,例如 YYYY-MM-DD。文档写的返回类型是 TEXT,但示例结果是日期,建议实测。 | 官方文档 |
| StarRocks | 需改写 | str_to_date(str, format) |
StarRocks 的 to_date 只接受 DATETIME 并取日期部分,不能解析字符串。按格式解析用 str_to_date,格式符与 date_format 相同;格式只含日期时返回 DATE,否则返回 DATETIME。 | 官方文档 |
| Doris | 需改写 | str_to_date(str, format) |
Doris 的 TO_DATE 只接受 DATETIME 并取日期部分。按格式解析用 STR_TO_DATE,返回 DATETIME,也接受 yyyyMMdd 等三种格式。 | 官方文档 |
| Hive | 需改写 | to_date(from_unixtime(unix_timestamp(str, pattern))) |
Hive 的 to_date 只返回时间戳字符串的日期部分,没有格式参数。返回类型在 Hive 2.1.0 之前是 string,之后是 date。 | 官方文档 |
| Spark SQL | 支持 | to_date(date_str[, fmt]) |
Spark 1.5.0 起提供。解析失败返回 NULL,省略 fmt 时按 CAST 规则转换。 | 官方文档 |
| Flink SQL | 支持 | TO_DATE(string1[, string2]) |
默认格式为 'yyyy-MM-dd'。 | 官方文档 |
迁移注意事项
- 同名不同义:把 MaxCompute 的 TO_DATE('20261013', 'yyyymmdd') 直接搬到 StarRocks、Doris 或 Hive 会报错或得到错误结果,需要改用 str_to_date 或 unix_timestamp。
- MaxCompute 传入 format 时返回 DATETIME 而不是 DATE。和 DATE 类型字段比较或写入 DATE 列时,注意类型转换。
- MaxCompute 的格式符里 mm 是月、mi 是分钟;Spark 和 Flink 里 MM 是月、mm 是分钟。
- MaxCompute 的日期字符串位数不对时返回 NULL,例如 '2025112' 配 'yyyymmdd'。
示例
解析 yyyyMMdd 格式的日期字符串
SELECT TO_DATE('20261013', 'yyyymmdd');SELECT TO_DATE('20261013', 'YYYYMMDD');SELECT str_to_date('20261013', '%Y%m%d');SELECT to_date(from_unixtime(unix_timestamp('20261013', 'yyyyMMdd')));SELECT to_date('20261013', 'yyyyMMdd');SELECT TO_DATE('20261013', 'yyyyMMdd');