文章目录
一、分类总览
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
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_44624117/article/details/166737404




