首页 / 日期
日期函数对照
日期函数在 MaxCompute、Hologres、StarRocks、Doris、Hive、Spark SQL、Flink SQL 中的写法对照,共 16 个函数。其中 15 个函数在部分引擎中需要改写或没有对应函数。
目录:add_months · date_add · date_format · date_sub · dateadd · datediff · datetrunc · dayofweek · from_unixtime · getdate · last_day · months_between · to_char · to_date · unix_timestamp · weekofyear
ADD_MONTHS 按月加减
ADD_MONTHS 给日期加上若干个月。月末日期是主要差异点:1 月 31 日加一个月,StarRocks、Doris 和 Spark 返回 2 月最后一天。返回类型也不同,MaxCompute 返回字符串,StarRocks 返回 DATETIME。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | ADD_MONTHS(startdate, num_months) |
| Hologres | 需改写 | d + interval '1 month' |
| StarRocks | 支持 | add_months(date, months) |
| Doris | 需改写 | MONTHS_ADD(date, nums) |
| Hive | 支持 | add_months(start_date, num_months[, output_date_format]) |
| Spark SQL | 支持 | add_months(start_date, num_months) |
| Flink SQL | 需改写 | TIMESTAMPADD(MONTH, n, timepoint) |
DATE_ADD 日期加减
DATE_ADD 给日期加上若干天。函数名相同,但 MaxCompute、Hive 和 Spark 直接传天数,StarRocks 和 Doris 要写 INTERVAL;返回类型也不同,MaxCompute 返回 DATE 并丢掉时间部分。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DATE_ADD(startdate, delta) |
| Hologres | 需改写 | DATEADD(d, num, 'day') |
| StarRocks | 支持 | DATE_ADD(date, INTERVAL n DAY) |
| Doris | 支持 | DATE_ADD(date, INTERVAL n DAY) |
| Hive | 支持 | date_add(startdate, days) |
| Spark SQL | 支持 | date_add(start_date, num_days) |
| Flink SQL | 需改写 | TIMESTAMPADD(DAY, n, timepoint) |
DATE_FORMAT 日期格式化
DATE_FORMAT 把日期或时间转换为指定格式的字符串。七个引擎用了四套格式符,同样写 mm,有的表示月,有的表示分钟,迁移时最容易出错。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DATE_FORMAT(date, format) |
| Hologres | 需改写 | TO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS') |
| StarRocks | 支持 | DATE_FORMAT(datetime, '%Y-%m-%d %H:%i:%s') |
| Doris | 支持 | DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') |
| Hive | 支持 | date_format(ts, pattern) |
| Spark SQL | 支持 | date_format(timestamp, fmt) |
| Flink SQL | 支持 | DATE_FORMAT(timestamp, format) |
DATE_SUB 日期减天数
DATE_SUB 从日期中减去若干天。MaxCompute、Hive 和 Spark 直接传天数,StarRocks 和 Doris 要写 INTERVAL,Hologres 和 Flink 没有这个函数。返回类型也不同,StarRocks 返回 DATETIME,MaxCompute 返回 DATE。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DATE_SUB(startdate, delta) |
| Hologres | 需改写 | d - interval '1 day' |
| StarRocks | 支持 | DATE_SUB(date, INTERVAL n DAY) |
| Doris | 支持 | DATE_SUB(date, INTERVAL n DAY) |
| Hive | 支持 | date_sub(startdate, days) |
| Spark SQL | 支持 | date_sub(start_date, num_days) |
| Flink SQL | 需改写 | TIMESTAMPADD(DAY, -n, timepoint) |
DATEADD 按单位加减日期
DATEADD 是 MaxCompute 的写法,可以按年、季、月、天、小时、分钟、秒加减时间,返回类型与输入相同。Hologres 同名可用;StarRocks、Doris 和 Flink 改用 TIMESTAMPADD 或 INTERVAL;Spark 的 dateadd 只能加天数,含义不同。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DATEADD(date, delta, datepart) |
| Hologres | 支持 | DATEADD(d, num, str) |
| StarRocks | 需改写 | TIMESTAMPADD(unit, n, datetime_expr) |
| Doris | 需改写 | TIMESTAMPADD(unit, n, datetime_expr) |
| Hive | 需改写 | date_add(startdate, days) / add_months(startdate, n) |
| Spark SQL | 需改写 | ts + INTERVAL n HOUR |
| Flink SQL | 需改写 | TIMESTAMPADD(unit, n, timepoint) |
DATEDIFF 日期差
DATEDIFF 计算两个日期之间相差多少天。多数引擎都是“结束日期在前”,但 MaxCompute 和 Hologres 支持按小时、分钟等单位计算,StarRocks 和 Doris 只按天计算,Flink 需要改用 TIMESTAMPDIFF。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DATEDIFF(end_date, start_date[, date_part]) |
| Hologres | 支持 | DATEDIFF(d1, d2, unit) |
| StarRocks | 支持 | DATEDIFF(expr1, expr2) |
| Doris | 支持 | DATEDIFF(expr1, expr2) |
| Hive | 支持 | datediff(enddate, startdate) |
| Spark SQL | 支持 | datediff(endDate, startDate) |
| Flink SQL | 需改写 | TIMESTAMPDIFF(DAY, timepoint1, timepoint2) |
DATETRUNC 日期截断
DATETRUNC 把日期截断到年、月、周等单位的起点,常用于按月汇总。MaxCompute 写 DATETRUNC 且日期在前,其他引擎多为 DATE_TRUNC 且单位在前,Hive 只能用 trunc 截断到月和年。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DATETRUNC(date, date_part) |
| Hologres | 需改写 | DATE_TRUNC('month', ts) |
| StarRocks | 需改写 | date_trunc('month', datetime) |
| Doris | 需改写 | DATE_TRUNC(datetime, 'month') |
| Hive | 需改写 | trunc(date, 'MM') |
| Spark SQL | 需改写 | date_trunc('MONTH', ts) |
| Flink SQL | 需改写 | FLOOR(timepoint TO MONTH) |
DAYOFWEEK 星期几
DAYOFWEEK 返回日期是星期几。MaxCompute、StarRocks、Doris、Spark 和 Flink 都以周日为 1、周六为 7;Hologres 的 EXTRACT(DOW ...) 以周日为 0,Hive 要用 EXTRACT(dayofweek FROM ...)。需要周一为 1 时,各引擎的写法都要额外换算。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DAYOFWEEK(date) |
| Hologres | 需改写 | EXTRACT(DOW FROM ts) + 1 |
| StarRocks | 支持 | dayofweek(date) |
| Doris | 支持 | DAYOFWEEK(date) |
| Hive | 需改写 | extract(dayofweek FROM ts) |
| Spark SQL | 支持 | dayofweek(date) |
| Flink SQL | 支持 | DAYOFWEEK(date) |
FROM_UNIXTIME 时间戳转日期
FROM_UNIXTIME 把以秒为单位的 Unix 时间戳转换为日期时间。各引擎的返回类型、格式参数和时区处理不同,Hologres 需要改用 TO_TIMESTAMP。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | FROM_UNIXTIME(unixtime) |
| Hologres | 需改写 | TO_TIMESTAMP(seconds) |
| StarRocks | 支持 | from_unixtime(unix_timestamp[, string_format]) |
| Doris | 支持 | FROM_UNIXTIME(unix_timestamp[, string_format]) |
| Hive | 支持 | from_unixtime(unixtime[, pattern]) |
| Spark SQL | 支持 | from_unixtime(unix_time[, fmt]) |
| Flink SQL | 支持 | FROM_UNIXTIME(numeric[, string]) |
GETDATE 获取当前时间
GETDATE 是 MaxCompute 获取当前日期时间的函数,其他引擎要换成 NOW() 或 CURRENT_TIMESTAMP。迁移时要注意返回类型、精度和时区,以及同一条 SQL 里是否每行返回相同的值。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | GETDATE() |
| Hologres | 别名 | NOW() 或 CURRENT_TIMESTAMP |
| StarRocks | 别名 | NOW([p]) |
| Doris | 别名 | NOW([precision]) |
| Hive | 别名 | current_timestamp |
| Spark SQL | 别名 | current_timestamp() 或 now() |
| Flink SQL | 别名 | CURRENT_TIMESTAMP 或 NOW() |
LAST_DAY 当月最后一天
LAST_DAY 返回日期所在月份的最后一天,常用于月末结算和账期计算。多数引擎同名可用,但返回类型不同;MaxCompute 和 StarRocks 还能取季末、年末,Flink 需要用 FLOOR 和 TIMESTAMPADD 组合计算。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | LAST_DAY(date[, date_part]) |
| Hologres | 支持 | LAST_DAY(ts) |
| StarRocks | 支持 | last_day(date[, unit]) |
| Doris | 支持 | LAST_DAY(date) |
| Hive | 支持 | last_day(date) |
| Spark SQL | 支持 | last_day(date) |
| Flink SQL | 需改写 | TIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH))) |
MONTHS_BETWEEN 相差月数
MONTHS_BETWEEN(end, start) 返回两个日期相差的月数,带小数。MaxCompute、Doris、Hive 和 Spark 同名可用,小数部分都按每月 31 天折算,但对时间部分和舍入的处理不同。StarRocks 的 months_diff 和 Flink 的 TIMESTAMPDIFF 只返回整数月,Flink 的参数顺序还是反的。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | MONTHS_BETWEEN(end_date, start_date) |
| Hologres | 需改写 | (EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b) |
| StarRocks | 需改写 | months_diff(expr1, expr2) |
| Doris | 支持 | MONTHS_BETWEEN(end, start[, round_type]) |
| Hive | 支持 | months_between(date1, date2) |
| Spark SQL | 支持 | months_between(timestamp1, timestamp2[, roundOff]) |
| Flink SQL | 需改写 | TIMESTAMPDIFF(MONTH, start, end) |
TO_CHAR 日期转字符串
TO_CHAR 把日期或数值转成字符串。MaxCompute、Hologres 和 Spark 同名可用,其他引擎改用 DATE_FORMAT。最大的坑是格式符:MaxCompute 的 mm 表示月、mi 表示分钟,Java 风格的格式中 MM 才是月、mm 是分钟。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | TO_CHAR(date, format) |
| Hologres | 支持 | TO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS') |
| StarRocks | 需改写 | DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') |
| Doris | 需改写 | DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') |
| Hive | 需改写 | date_format(ts, 'yyyy-MM-dd HH:mm:ss') |
| Spark SQL | 支持 | to_char(expr, format) |
| Flink SQL | 需改写 | DATE_FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss') |
TO_DATE 字符串转日期
TO_DATE 在不同引擎里有两种含义:MaxCompute、Hologres、Spark 和 Flink 用它按格式解析字符串;Hive、StarRocks 和 Doris 的 TO_DATE 只取日期部分,不能按格式解析。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | TO_DATE(date_str[, format]) |
| Hologres | 支持 | TO_DATE(text, format) |
| StarRocks | 需改写 | str_to_date(str, format) |
| Doris | 需改写 | str_to_date(str, format) |
| Hive | 需改写 | to_date(from_unixtime(unix_timestamp(str, pattern))) |
| Spark SQL | 支持 | to_date(date_str[, fmt]) |
| Flink SQL | 支持 | TO_DATE(string1[, string2]) |
UNIX_TIMESTAMP 日期转时间戳
UNIX_TIMESTAMP 把日期时间转换为距 1970-01-01 的秒数。各引擎都返回秒,但格式参数的写法、时区处理和超出范围时的结果不同,Hologres 要改用 EXTRACT(EPOCH FROM ...)。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | UNIX_TIMESTAMP(date) |
| Hologres | 需改写 | EXTRACT(EPOCH FROM ts) |
| StarRocks | 支持 | UNIX_TIMESTAMP([date[, fmt]]) |
| Doris | 支持 | UNIX_TIMESTAMP([date[, fmt]]) |
| Hive | 支持 | unix_timestamp(date[, pattern]) |
| Spark SQL | 支持 | unix_timestamp([timeExp[, fmt]]) |
| Flink SQL | 支持 | UNIX_TIMESTAMP(string1[, string2]) |
WEEKOFYEAR 一年中的第几周
WEEKOFYEAR 返回日期在一年中的第几周。多数引擎以周一为一周的开始,并按“第一周至少有 4 天”的规则计算,所以 1 月初可能返回 52 或 53。Hologres 用 EXTRACT(WEEK FROM ...),返回 DOUBLE PRECISION;Flink 用 WEEK。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | WEEKOFYEAR(date[, date_part]) |
| Hologres | 需改写 | EXTRACT(WEEK FROM ts) |
| StarRocks | 支持 | WEEKOFYEAR(date) |
| Doris | 支持 | WEEKOFYEAR(date) |
| Hive | 支持 | weekofyear(string date) |
| Spark SQL | 支持 | weekofyear(date) |
| Flink SQL | 别名 | WEEK(date) |