ha_lydms头像
关注
MaxCompute中日期与时间函数封面图

MaxCompute中日期与时间函数


一、分类总览

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_ADDTIME 时间增加指定幅度
2、日期加减类TIME_SUBTIME 时间减少指定幅度
3、日期差值类DATEDIFF计算两个日期的差值
3、日期差值类MONTHS_BETWEEN计算两个日期之间相差的月数
3、日期差值类TIME_DIFF计算两个 TIME 时间之间的差值
4、格式转换类DATE_FORMAT日期转指定格式字符串
4、格式转换类FORMAT_TIMETIME 微秒值转时间字符串
4、格式转换类TO_CHAR日期转指定格式字符串
4、格式转换类TO_DATE指定格式字符串转日期
5、时间戳转换类FROM_UNIXTIMEUNIX 秒时间戳转日期
5、时间戳转换类TO_MILLIS日期转 UNIX 毫秒时间戳
5、时间戳转换类TO_TIME构造或转换为微秒表示的 TIME
5、时间戳转换类TO_TIMESTAMP_NTZ转换为无时区 TIMESTAMP_NTZ
5、时间戳转换类UNIX_TIMESTAMP日期转 UNIX 秒时间戳
6、时区转换类FROM_UTC_TIMESTAMPUTC 时间转换到指定时区
6、时区转换类TO_UTC_TIMESTAMP指定时区时间转换为 UTC
7、日期 / 时间截断类DATETRUNC日期按年、月、日等粒度截断
7、日期 / 时间截断类TIME_TRUNCTIME 按小时、分钟、秒等粒度截断
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_ADDTIME 增加
TIME_SUBTIME 减少

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_DIFFTIME 时间差

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_TIMETIME 转字符串

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_UNIXTIMEUNIX 秒 → 日期
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_TIMESTAMPUTC → 指定时区
TO_UTC_TIMESTAMP指定时区 → UTC

1、定义

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

2、区别

函数方向
FROM_UTC_TIMESTAMPUTC → 指定时区
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_TRUNCTIME 截断
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季度
ISOYEARISO 年
WEEKDAY周中的第几天
WEEKOFYEAR年中的第几周

1、定义

这一类函数本质上都是:

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

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

2、区别

对比区别
DATEPART时间单位以字符串参数传入
EXTRACT使用 EXTRACT(YEAR FROM date) 语法
YEAR / MONTH / DAY...固定提取某一部分,最直接
DAY vs DAYOFMONTH都表示月中的“日”
DAYOFWEEK vs WEEKDAY都表示星期,但编号体系不同
ISOYEAR vs YEARISO 周历年份 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 GETDATETIMESTAMP 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_TIMESTAMPUNIX 秒→日期 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_TIMESTAMPUTC→指定时区 vs 指定时区→UTC
TIME_ADD vs DATEADDTIME 运算 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

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_44624117/article/details/166737404

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--