SQL 方言通

首页 / 日期

日期函数对照

日期函数在 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)

其他分类

最近核对: