云计算百科
云计算领域专业知识百科平台

MaxCompute中日期与时间函数

文章目录

  • 一、分类总览
    • 1、函数分类
    • 2、全部函数
  • 二、当前时间 / 时区类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 三、日期加减类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 四、日期差值类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 五、格式转换类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 六、时间戳转换类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 七、时区转换类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 八、日期 / 时间截断类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 九、日期部分提取类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 十、月末 / 星期计算类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 十一、日期校验类
    • 1、定义
    • 2、区别
    • 3、简单记忆
    • 4、案例
  • 十二、最容易混淆的函数对比
  • 十三、常用案例
    • 1、获取昨天日期
    • 2、获取业务日期 yyyyMMdd
    • 3、获取月份 yyyyMM
    • 4、计算两个时间相差分钟数
    • 5、13 位毫秒时间戳转日期
    • 6、获取月末日期
    • 7、按月截断日期
    • 8、字符串日期转换
  • 十四、参考资料

一、分类总览

1、函数分类

分类主要解决的问题代表函数
1、当前时间 / 时区类 获取当前时间、当前时区 CURRENT_TIMESTAMP、CURRENT_TIMEZONE、GETDATE、NOW
2、日期加减类 对日期增加或减少年、月、日、时、分、秒 ADD_MONTHS、DATE_ADD、DATE_SUB、DATEADD、TIME_ADD、TIME_SUB
3、日期差值类 计算两个日期或时间之间的差值 DATEDIFF、MONTHS_BETWEEN、TIME_DIFF
4、格式转换类 日期、字符串、TIME 之间格式转换 DATE_FORMAT、TO_CHAR、TO_DATE、FORMAT_TIME
5、时间戳转换类 UNIX 秒、毫秒、TIME、TIMESTAMP_NTZ 转换 FROM_UNIXTIME、UNIX_TIMESTAMP、TO_MILLIS、TO_TIME、TO_TIMESTAMP_NTZ
6、时区转换类 UTC 与指定时区之间转换 FROM_UTC_TIMESTAMP、TO_UTC_TIMESTAMP
7、日期 / 时间截断类 按年、月、日、小时等粒度截断 DATETRUNC、TIME_TRUNC、TRUNC_TIME
8、日期部分提取类 提取年、月、日、时、分、秒、季度、星期 DATEPART、EXTRACT、YEAR、MONTH、DAY 等
9、月末 / 星期计算类 获取月末、下一个指定星期 LAST_DAY、LASTDAY、NEXT_DAY
10、日期校验类 判断字符串是否符合日期格式 ISDATE

2、全部函数

分类函数功能
1、当前时间 / 时区类 CURRENT_TIMESTAMP 返回当前 TIMESTAMP 时间戳
1、当前时间 / 时区类 CURRENT_TIMEZONE 返回当前系统时区
1、当前时间 / 时区类 GETDATE 获取当前系统时间,返回 DATETIME
1、当前时间 / 时区类 NOW 获取当前系统日期与时间,返回 DATETIME
2、日期加减类 ADD_MONTHS 日期增加或减少指定月数
2、日期加减类 DATE_ADD 日期增加或减少指定天数
2、日期加减类 DATE_SUB 日期减少或增加指定天数
2、日期加减类 DATEADD 按年、月、日、时、分、秒修改日期
2、日期加减类 TIME_ADD TIME 时间增加指定幅度
2、日期加减类 TIME_SUB TIME 时间减少指定幅度
3、日期差值类 DATEDIFF 计算两个日期的差值
3、日期差值类 MONTHS_BETWEEN 计算两个日期之间相差的月数
3、日期差值类 TIME_DIFF 计算两个 TIME 时间之间的差值
4、格式转换类 DATE_FORMAT 日期转指定格式字符串
4、格式转换类 FORMAT_TIME TIME 微秒值转时间字符串
4、格式转换类 TO_CHAR 日期转指定格式字符串
4、格式转换类 TO_DATE 指定格式字符串转日期
5、时间戳转换类 FROM_UNIXTIME UNIX 秒时间戳转日期
5、时间戳转换类 TO_MILLIS 日期转 UNIX 毫秒时间戳
5、时间戳转换类 TO_TIME 构造或转换为微秒表示的 TIME
5、时间戳转换类 TO_TIMESTAMP_NTZ 转换为无时区 TIMESTAMP_NTZ
5、时间戳转换类 UNIX_TIMESTAMP 日期转 UNIX 秒时间戳
6、时区转换类 FROM_UTC_TIMESTAMP UTC 时间转换到指定时区
6、时区转换类 TO_UTC_TIMESTAMP 指定时区时间转换为 UTC
7、日期 / 时间截断类 DATETRUNC 日期按年、月、日等粒度截断
7、日期 / 时间截断类 TIME_TRUNC TIME 按小时、分钟、秒等粒度截断
7、日期 / 时间截断类 TRUNC_TIME 日期或时间按粒度截断后返回字符串
8、日期部分提取类 DATEPART 按指定单位提取日期字段
8、日期部分提取类 DAY 提取日期中的日
8、日期部分提取类 DAYOFMONTH 提取月中的第几天
8、日期部分提取类 DAYOFWEEK 提取星期值
8、日期部分提取类 DAYOFYEAR 提取年中的第几天
8、日期部分提取类 EXTRACT 从日期 / 时间戳提取指定部分
8、日期部分提取类 HOUR 提取小时
8、日期部分提取类 ISOYEAR 提取 ISO 8601 年份
8、日期部分提取类 MINUTE 提取分钟
8、日期部分提取类 MONTH 提取月份
8、日期部分提取类 QUARTER 提取季度
8、日期部分提取类 SECOND 提取秒
8、日期部分提取类 WEEKDAY 提取当前周第几天
8、日期部分提取类 WEEKOFYEAR 提取当年第几周
8、日期部分提取类 YEAR 提取年份
9、月末 / 星期计算类 LAST_DAY 获取所在月最后一天,返回字符串
9、月末 / 星期计算类 LASTDAY 获取所在月最后一天,返回 DATETIME
9、月末 / 星期计算类 NEXT_DAY 获取指定日期之后的下一个星期几
10、日期校验类 ISDATE 判断字符串是否能按指定格式转成日期

二、当前时间 / 时区类

函数功能
CURRENT_TIMESTAMP 当前 TIMESTAMP
CURRENT_TIMEZONE 当前系统时区
GETDATE 当前 DATETIME
NOW 当前 DATETIME

1、定义

  • CURRENT_TIMESTAMP:返回当前 TIMESTAMP 类型时间戳。
  • CURRENT_TIMEZONE:返回当前系统的时区信息。
  • GETDATE:返回当前系统时间,类型为 DATETIME。
  • NOW:返回当前系统日期与时间,类型为 DATETIME。

2、区别

对比区别
CURRENT_TIMESTAMP 返回 TIMESTAMP
GETDATE / NOW 返回 DATETIME
CURRENT_TIMEZONE 返回时区字符串,不返回日期
GETDATE vs NOW 都获取当前时间;NOW 返回格式带毫秒部分

MaxCompute 中 GETDATE() 在同一个 SQL 执行期间返回固定值。

3、简单记忆

CURRENT_TIMESTAMP = 当前时间戳。 CURRENT_TIMEZONE = 当前时区。 GETDATE / NOW = 当前日期时间。

4、案例

— 结果:当前 TIMESTAMP,例如 2026-09-27 16:30:00.123
SELECT CURRENT_TIMESTAMP();

— 结果:Asia/Shanghai
SELECT CURRENT_TIMEZONE();

— 结果:当前系统 DATETIME
SELECT GETDATE();

— 结果:当前系统 DATETIME,带毫秒
SELECT NOW();


三、日期加减类

函数功能
ADD_MONTHS 加减月
DATE_ADD 加减天
DATE_SUB 减天
DATEADD 按指定单位加减
TIME_ADD TIME 增加
TIME_SUB TIME 减少

1、定义

  • ADD_MONTHS:专门处理月份加减。
  • DATE_ADD:专门处理天数加减。
  • DATE_SUB:与 DATE_ADD 增减逻辑相反。
  • DATEADD:可以按年、月、日、时、分、秒修改日期。
  • TIME_ADD:对 TIME 时间增加指定幅度。
  • TIME_SUB:对 TIME 时间减少指定幅度。

2、区别

对比区别
ADD_MONTHS 专门处理月
DATE_ADD / DATE_SUB 只处理天
DATEADD 支持年、月、日、时、分、秒
TIME_ADD / TIME_SUB 针对一天内的 TIME,而不是完整日期
DATE_ADD vs DATE_SUB 正数参数时,一个加天,一个减天

3、简单记忆

月:ADD_MONTHS。 天:DATE_ADD / DATE_SUB。 年月日时分秒:DATEADD。 纯时间:TIME_ADD / TIME_SUB。

4、案例

— 结果:2017-05-14
SELECT ADD_MONTHS('2017-02-14', 3);

— 结果:2005-03-01
SELECT DATE_ADD(DATE '2005-02-28', 1);

— 结果:2005-02-28
SELECT DATE_SUB(DATE '2005-03-01', 1);

— 结果:2005-03-30 02:24:00
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', –3, 'hh');

— 结果:15:44:40
SELECT FORMAT_TIME(TIME_ADD(TO_TIME('15:39:40','%H:%M:%S'), 5, 'mi'), '%H:%M:%S');

— 结果:15:39:35
SELECT FORMAT_TIME(TIME_SUB(TO_TIME('15:39:40','%H:%M:%S'), 5, 'second'), '%H:%M:%S');


四、日期差值类

函数功能
DATEDIFF 通用日期差
MONTHS_BETWEEN 月份差
TIME_DIFF TIME 时间差

1、定义

  • DATEDIFF:计算两个日期之间的差值,并按指定单位返回。
  • MONTHS_BETWEEN:专门计算两个日期之间相差多少个月。
  • TIME_DIFF:计算两个 TIME 时间之间的差值。

2、区别

对比区别
DATEDIFF 通用,支持日、时、分、秒等单位
MONTHS_BETWEEN 专门计算月数,可返回小数
TIME_DIFF 专门针对 TIME

3、简单记忆

日期差:DATEDIFF。 月份差:MONTHS_BETWEEN。 TIME 差:TIME_DIFF。

4、案例

— 结果:11
SELECT DATEDIFF(DATE '2013-05-21', DATE '2013-05-10', 'dd');

— 结果:-3.0
SELECT MONTHS_BETWEEN('1996-09-30', '1996-12-31');

— 结果:10
SELECT TIME_DIFF(TO_TIME(15,39,40), TO_TIME(15,39,30), 'second');


五、格式转换类

函数功能
DATE_FORMAT 日期转字符串
TO_CHAR 日期转字符串
TO_DATE 字符串转日期
FORMAT_TIME TIME 转字符串

1、定义

  • DATE_FORMAT:按照格式模板将日期转换成字符串。
  • TO_CHAR:按照指定格式将日期转换成字符串。
  • TO_DATE:把指定格式的字符串转换成日期。
  • FORMAT_TIME:将微秒表示的 TIME 格式化成字符串。

2、区别

对比区别
DATE_FORMAT vs TO_CHAR 都是日期→字符串,但支持类型和格式规则不同
TO_DATE 字符串→日期,方向相反
FORMAT_TIME 专门处理 TIME 微秒值

3、简单记忆

日期变字符串:DATE_FORMAT / TO_CHAR。 字符串变日期:TO_DATE。 TIME 变字符串:FORMAT_TIME。

4、案例

— 结果:2022-04-24
SELECT DATE_FORMAT('2022-04-24', 'yyyy-MM-dd');

— 结果:20080718
SELECT TO_CHAR(DATETIME '2008-07-18 00:00:00', 'yyyymmdd');

— 结果:2008-07-18 00:00:00
SELECT TO_DATE('20080718', 'yyyymmdd');

— 结果:15:39:40
SELECT FORMAT_TIME(TO_TIME('15:39:40', '%H:%M:%S'), '%H:%M:%S');


六、时间戳转换类

函数功能
FROM_UNIXTIME UNIX 秒 → 日期
UNIX_TIMESTAMP 日期 → UNIX 秒
TO_MILLIS 日期 → UNIX 毫秒
TO_TIME 转 TIME 微秒值
TO_TIMESTAMP_NTZ 转无时区时间戳

1、定义

  • FROM_UNIXTIME:把 UNIX 秒时间戳转换成日期。
  • UNIX_TIMESTAMP:把日期转换成 UNIX 秒时间戳。
  • TO_MILLIS:把日期转换成 UNIX 毫秒时间戳。
  • TO_TIME:把时间构造成从当天 00:00:00 开始累计的微秒值。
  • TO_TIMESTAMP_NTZ:把日期时间转换成无时区 TIMESTAMP_NTZ。

2、区别

对比区别
FROM_UNIXTIME 秒时间戳 → 日期
UNIX_TIMESTAMP 日期 → 秒时间戳
TO_MILLIS 日期 → 毫秒时间戳
TO_TIME 表示一天中的时间,单位为微秒
TO_TIMESTAMP_NTZ 得到无时区时间戳

3、简单记忆

FROM_UNIXTIME = 时间戳回来。 UNIX_TIMESTAMP = 日期变秒。 TO_MILLIS = 日期变毫秒。 TO_TIME = 变 TIME。 TO_TIMESTAMP_NTZ = 变无时区时间戳。

4、案例

— 结果:1973-11-30 05:33:09
SELECT FROM_UNIXTIME(123456789);

— 结果:1699585860
SELECT UNIX_TIMESTAMP(DATETIME '2023-11-10 11:11:00');

— 结果:1617174900000
SELECT TO_MILLIS(DATETIME '2021-03-31 15:15:00');

— 结果:48273000000
SELECT TO_TIME('13:24:33', '%H:%M:%S');

— 结果:2025-05-18 15:30:00
SELECT TO_TIMESTAMP_NTZ('2025-05-18 15:30:00', '%F %T');


七、时区转换类

函数功能
FROM_UTC_TIMESTAMP UTC → 指定时区
TO_UTC_TIMESTAMP 指定时区 → UTC

1、定义

  • FROM_UTC_TIMESTAMP:把 UTC 时间转换成指定时区时间。
  • TO_UTC_TIMESTAMP:把指定时区时间转换成 UTC。

2、区别

函数方向
FROM_UTC_TIMESTAMP UTC → 指定时区
TO_UTC_TIMESTAMP 指定时区 → UTC

3、简单记忆

FROM UTC = 从 UTC 出来。 TO UTC = 转到 UTC。

4、案例

— 结果:把 UTC 时间转换为 PST
SELECT FROM_UTC_TIMESTAMP(1501557840000, 'PST');

— 结果:把 Asia/Shanghai 时间转换为 UTC
SELECT TO_UTC_TIMESTAMP(TIMESTAMP '2021-11-29 08:00:00', 'Asia/Shanghai');


八、日期 / 时间截断类

函数功能
DATETRUNC 日期截断
TIME_TRUNC TIME 截断
TRUNC_TIME 截断后返回 STRING

1、定义

  • DATETRUNC:把日期向下截断到指定日期粒度。
  • TIME_TRUNC:把 TIME 向下截断到指定时间粒度。
  • TRUNC_TIME:截断日期或时间后,以字符串返回。

2、区别

对比区别
DATETRUNC 处理日期 / 时间戳
TIME_TRUNC 处理 TIME 微秒值
TRUNC_TIME 截断后返回 STRING,更偏展示或维度字段

3、简单记忆

日期截断:DATETRUNC。 TIME 截断:TIME_TRUNC。 截完变字符串:TRUNC_TIME。

4、案例

— 结果:2011-12-01 00:00:00
SELECT DATETRUNC(DATETIME '2011-12-07 16:28:46', 'month');

— 结果:15:31:00
SELECT FORMAT_TIME(TIME_TRUNC(TO_TIME('15:31:38.776', 'HH:MI:SS.ff3'), 'MINUTE'), '%H:%M:%S');

— 结果:2025-06
SELECT TRUNC_TIME(DATE '2025-06-10', 'month');


九、日期部分提取类

函数功能
DATEPART 通用日期部分提取
EXTRACT 标准语法提取日期部分
YEAR 年
MONTH 月
DAY 日
DAYOFMONTH 月中的第几天
DAYOFWEEK 星期
DAYOFYEAR 年中的第几天
HOUR 时
MINUTE 分
SECOND 秒
QUARTER 季度
ISOYEAR ISO 年
WEEKDAY 周中的第几天
WEEKOFYEAR 年中的第几周

1、定义

这一类函数本质上都是:

从一个完整日期中提取某一个日期部分。

DATEPART 和 EXTRACT 是通用函数,其余函数是固定字段的快捷写法。

2、区别

对比区别
DATEPART 时间单位以字符串参数传入
EXTRACT 使用 EXTRACT(YEAR FROM date) 语法
YEAR / MONTH / DAY… 固定提取某一部分,最直接
DAY vs DAYOFMONTH 都表示月中的“日”
DAYOFWEEK vs WEEKDAY 都表示星期,但编号体系不同
ISOYEAR vs YEAR ISO 周历年份 vs 普通日历年份
WEEKOFYEAR 返回当年第几周

3、简单记忆

通用提取:DATEPART / EXTRACT。 明确字段:直接 YEAR / MONTH / DAY / HOUR…。 周相关:DAYOFWEEK / WEEKDAY / WEEKOFYEAR / ISOYEAR。

4、案例

— 结果:2013
SELECT DATEPART(DATETIME '2013-06-08 01:10:00', 'yyyy');

— 结果:2019
SELECT EXTRACT(YEAR FROM TIMESTAMP '2019-05-01 11:21:00');

— 结果:2026
SELECT YEAR(DATETIME '2026-09-27 15:30:45');

— 结果:9
SELECT MONTH(DATETIME '2026-09-27 15:30:45');

— 结果:27
SELECT DAY(DATETIME '2026-09-27 15:30:45');

— 结果:27
SELECT DAYOFMONTH('2026-09-27');

— 结果:5
SELECT DAYOFWEEK('2009-07-30');

— 结果:270
SELECT DAYOFYEAR('2026-09-27');

— 结果:15
SELECT HOUR(DATETIME '2026-09-27 15:30:45');

— 结果:30
SELECT MINUTE(DATETIME '2026-09-27 15:30:45');

— 结果:45
SELECT SECOND(DATETIME '2026-09-27 15:30:45');

— 结果:3
SELECT QUARTER('2026-09-27');

— 结果:2026
SELECT ISOYEAR(DATE '2026-09-27');

— 结果:4
SELECT WEEKDAY(DATETIME '2009-03-20 11:11:00');

— 结果:39
SELECT WEEKOFYEAR('2026-09-27');


十、月末 / 星期计算类

函数功能
LAST_DAY 月末,返回 STRING
LASTDAY 月末,返回 DATETIME
NEXT_DAY 下一个指定星期

1、定义

  • LAST_DAY:获取指定日期所在月最后一天。
  • LASTDAY:同样获取月末,但返回 DATETIME。
  • NEXT_DAY:获取大于指定日期且匹配目标星期的第一个日期。

2、区别

对比区别
LAST_DAY 返回 STRING,通常是 yyyy-mm-dd
LASTDAY 返回 DATETIME,时间部分为 00:00:00
NEXT_DAY 不是月末计算,而是向后找目标星期

3、简单记忆

月末字符串:LAST_DAY。 月末 DATETIME:LASTDAY。 下一个星期几:NEXT_DAY。

4、案例

— 结果:2017-03-31
SELECT LAST_DAY('2017-03-04');

— 结果:2013-06-30 00:00:00
SELECT LASTDAY(DATETIME '2013-06-08 01:10:00');

— 结果:2017-08-08
SELECT NEXT_DAY('2017-08-01', 'TU');


十一、日期校验类

函数功能
ISDATE 判断字符串是否符合指定日期格式

1、定义

ISDATE 用于判断一个字符串是否能够按照指定格式转换成日期值。

2、区别

ISDATE 只负责判断,不会真正执行日期转换。

常见组合:

先用 ISDATE 判断,再用 TO_DATE 转换。

3、简单记忆

ISDATE = “是不是合法日期”。

4、案例

— 结果:true
SELECT ISDATE('2021-10-11', 'yyyy-mm-dd');


十二、最容易混淆的函数对比

函数组合最核心区别
GETDATE vs NOW 都返回 DATETIME;NOW 展示毫秒更直观
CURRENT_TIMESTAMP vs GETDATE TIMESTAMP vs DATETIME
DATE_ADD vs DATE_SUB 正数参数时,加天 vs 减天
DATE_ADD vs DATEADD 只按天 vs 支持年月日时分秒
ADD_MONTHS vs DATEADD 专门按月 vs 多单位
DATEDIFF vs MONTHS_BETWEEN 通用日期差 vs 专门计算月份差
DATE_FORMAT vs TO_CHAR 都是日期转字符串,但支持类型 / 格式规则不同
TO_CHAR vs TO_DATE 日期→字符串 vs 字符串→日期
FROM_UNIXTIME vs UNIX_TIMESTAMP UNIX 秒→日期 vs 日期→UNIX 秒
UNIX_TIMESTAMP vs TO_MILLIS 秒时间戳 vs 毫秒时间戳
DATETRUNC vs TRUNC_TIME 返回日期类型 vs 返回 STRING
DATETRUNC vs TIME_TRUNC 完整日期截断 vs TIME 截断
DATEPART vs EXTRACT 字符串单位参数 vs标准 EXTRACT 语法
DAY vs DAYOFMONTH 都表示月中的日
DAYOFWEEK vs WEEKDAY 都表示星期,但编号规则不同
YEAR vs ISOYEAR 普通日历年 vs ISO 周历年
LAST_DAY vs LASTDAY 返回 STRING vs 返回 DATETIME
FROM_UTC_TIMESTAMP vs TO_UTC_TIMESTAMP UTC→指定时区 vs 指定时区→UTC
TIME_ADD vs DATEADD TIME 运算 vs 完整日期时间运算
ISDATE vs TO_DATE 判断是否合法 vs 真正执行转换

十三、常用案例

1、获取昨天日期

— 结果:当前日期的前一天
SELECT DATEADD(GETDATE(), –1, 'dd') AS yesterday;

2、获取业务日期 yyyyMMdd

— 结果:例如 20260927
SELECT TO_CHAR(GETDATE(), 'yyyymmdd') AS biz_date;

3、获取月份 yyyyMM

— 结果:例如 202609
SELECT TO_CHAR(GETDATE(), 'yyyymm') AS month_id;

4、计算两个时间相差分钟数

— 结果:30
SELECT DATEDIFF(DATETIME '2026-09-27 11:30:00', DATETIME '2026-09-27 11:00:00', 'mi') AS diff_min;

5、13 位毫秒时间戳转日期

— 结果:先将毫秒除以 1000,再转 DATETIME
SELECT FROM_UNIXTIME(CAST(1784822400000 / 1000 AS BIGINT)) AS datetime_value;

6、获取月末日期

— 结果:2026-09-30
SELECT LAST_DAY('2026-09-27') AS month_end;

7、按月截断日期

— 结果:2026-09-01 00:00:00
SELECT DATETRUNC(DATETIME '2026-09-27 15:30:45', 'month') AS month_start;

8、字符串日期转换

— 结果:2026-09-27 00:00:00
SELECT TO_DATE('20260927', 'yyyymmdd') AS biz_date;


十四、参考资料

阿里云 MaxCompute 官方文档:

https://help.aliyun.com/zh/maxcompute/date-functions

赞(0)
未经允许不得转载:网硕互联帮助中心 » MaxCompute中日期与时间函数
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!