首页 / 日期
GETDATE 获取当前时间
GETDATE 是 MaxCompute 获取当前日期时间的函数,其他引擎要换成 NOW() 或 CURRENT_TIMESTAMP。迁移时要注意返回类型、精度和时区,以及同一条 SQL 里是否每行返回相同的值。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | GETDATE() | 返回 DATETIME,以东八区时间为标准。同一条 SQL 中总是返回固定值,精度到秒;开启 2.0 数据类型后精度到毫秒。 | 官方文档 |
| Hologres | 别名 | NOW() 或 CURRENT_TIMESTAMP | 返回当前事务的开始时刻,NOW、CURRENT_TIMESTAMP 和 TRANSACTION_TIMESTAMP 等效。需要每次调用都取实时时刻时用 CLOCK_TIMESTAMP。 | 官方文档 |
| StarRocks | 别名 | NOW([p]) | 别名有 current_timestamp、localtime 和 localtimestamp,返回 DATETIME,默认精度到秒。3.1.6 起可以传 1~6 指定秒后的小数位数。结果受时区设置影响。 | 官方文档 |
| Doris | 别名 | NOW([precision]) | 别名是 current_timestamp(),返回 DATETIME。precision 取 0~6,默认 0,超出范围时报错。 | 官方文档 |
| Hive | 别名 | current_timestamp | Hive 1.2.0 起提供,返回查询开始时的时间戳,同一查询中各次调用结果相同。unix_timestamp() 无参写法从 2.0 起已废弃,文档建议改用 CURRENT_TIMESTAMP。 | 官方文档 |
| Spark SQL | 别名 | current_timestamp() 或 now() | 返回查询开始执行时的时间戳,同一查询中各次调用结果相同。3.4.0 起还有不带时区的 localtimestamp()。 | 官方文档 |
| Flink SQL | 别名 | CURRENT_TIMESTAMP 或 NOW() | 返回本地时区的 TIMESTAMP_LTZ(3)。流模式下每条记录都会重新求值,批模式下只在查询开始时求值一次。 | 官方文档 |
迁移注意事项
- Flink 流模式下 CURRENT_TIMESTAMP 每条记录都重新求值,同一批数据的结果并不相同。离线 SQL 里依赖“整条 SQL 共用一个时间”的写法,在 Flink 流作业里会出现不同的值。
- MaxCompute 的 GETDATE 固定使用东八区,其他引擎的结果取决于会话或集群时区。迁移后如果时间差了 8 小时,先检查时区设置。
- 返回类型不同:MaxCompute、StarRocks 和 Doris 返回 DATETIME,Hologres 的 NOW 带时区(文档把不带时区的版本单独列为 LOCALTIMESTAMP),Flink 返回 TIMESTAMP_LTZ(3)。直接写入字符串或 DATETIME 字段时,格式可能变化。
- 精度不同:MaxCompute 默认到秒,StarRocks 和 Doris 默认到秒、可传参数到微秒,Flink 到毫秒。用当前时间做去重或比较时要注意小数部分。
- Hive 和 Spark 的 current_timestamp 可以不带括号,Doris 文档中的写法是 current_timestamp()。迁移时统一写 NOW() 更容易对齐。
示例
记录数据写入时间
SELECT id, GETDATE() AS etl_time FROM src;SELECT id, NOW() AS etl_time FROM src;SELECT id, NOW() AS etl_time FROM src;SELECT id, NOW() AS etl_time FROM src;SELECT id, current_timestamp AS etl_time FROM src;SELECT id, current_timestamp() AS etl_time FROM src;SELECT id, CURRENT_TIMESTAMP AS etl_time FROM src;