DATETRUNC函数用于将日期/时间数据按照指定的时间单位datepart进行截取,并返回截取后的日期/时间值。
命令格式
DATETRUNC函数支持以下两种签名格式,可以根据不同使用需求选择合适的函数签名。
签名1:将日期/时间数据DATE|DATETIME|TIMESTAMP_NTZ按照指定的时间单位datepart进行截取,并返回截取后的日期/时间值。
DATE|DATETIME|TIMESTAMP_NTZ DATETRUNC(DATE|DATETIME|TIMESTAMP_NTZ <date>, STRING <datepart>)
签名2:按照指定的时间单位datepart进行截取,并返回当前Session/Project时区的时间戳值。
TIMESTAMP DATETRUNC(TIMESTAMP <date>,STRING <datepart>[, STRING <time_zone>])
参数说明
date:必填。日期或时间戳,支持DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型。
如果输入为STRING类型,且是MaxCompute项目的1.0数据类型版本,则会隐式转换为DATETIME类型后参与运算,即
yyyy-mm-dd hh:mi:ss
。例如“2025-07-21 00:00:00”
,则会隐式转换为DATETIME类型后参与运算。datepart:必填。指定截断的时间单位。STRING类型常量。非常量、不支持的格式或其他类型会返回报错。 支持如下取值:
时间单位
取值
年
year
或yyyy
季度
quarter
或q
月
month
或mon
或mm
周
week
或week(weekday)
ISO周
isoweek
日
day
或dd
小时
hour
或hh
分钟
mi
秒
ss
毫秒
ff3
说明week
是以周一为一周的第一天,等效于week(weekday)
。week(weekday)
周从指定的星期几(weekday)
开始算起。weekday
的有效值为:周日(SUNDAY)、周一(MONDAY)、周二(TUESDAY)、周三(WEDNESDAY)、周四(THURSDAY)、周五(FRIDAY)以及周六(SATURDAY)。isoweek
采用ISO 8601所规定的周边界。ISO标准下的周从周一开始算起。
time_zone:可选。STRING类型。用来指定TIMESTAMP类型数据的时区。若未指定时区,则默认为当前Session/Project的时区。时区详情请参见时区列表。
说明若您未修改过项目时区,则默认为东八区(UTC+08:00)。
返回值说明
返回DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型。与输入参数date数据类型一致。返回规则如下:
date非DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型时,返回报错。
date值为NULL时,返回报错。
datepart值为NULL时,返回NULL。
使用示例
示例1:静态数据常见用法
-- 返回2024-01-01 00:00:00
SELECT DATETRUNC(DATETIME'2024-12-07 16:28:46', 'yyyy');
-- 返回2024-12-01 00:00:00
SELECT DATETRUNC(DATETIME'2024-12-07 16:28:46', 'MONTH');
-- 返回2024-12-02
SELECT DATETRUNC(DATE'2024-12-07', 'week(monday)');
-- 返回2024-10-01 00:00:00
SELECT DATETRUNC(TIMESTAMP_NTZ'2024-12-07 16:28:46', 'q');
-- 返回2024-12-07 16:28:46
SELECT DATETRUNC(TIMESTAMP_NTZ'2024-12-07 16:28:46.123', 'ss');
-- 返回2024-12-07 16:28:46.123
SELECT DATETRUNC(TIMESTAMP_NTZ'2024-12-07 16:28:46.123456', 'ff3');
-- 返回NULL
SELECT DATETRUNC(DATE'2024-12-07', NULL);
示例2:使用time_zone参数指定时区
date类型为TIMESTAMP类型时,支持使用time_zone参数指定时区,返回当前Session/Project时区时间戳。
SET odps.sql.timezone=Asia/Shanghai;
-- 返回2024-01-01 00:00:00 默认时区为Asia/Shanghai
SELECT DATETRUNC(TIMESTAMP '2024-12-07 16:28:46', 'yyyy');
-- 返回2025-01-01 01:00:00
SELECT DATETRUNC(TIMESTAMP '2025-03-27 16:28:46', 'quarter','Asia/Jakarta');
-- 返回2025-03-21 01:00:00
SELECT DATETRUNC(TIMESTAMP '2025-03-27 16:28:46', 'week(friday)','Asia/Jakarta');
-- 返回2025-03-24 08:00:00
SELECT DATETRUNC(TIMESTAMP '2025-03-27 16:28:46', 'isoweek','Etc/GMT');
-- 返回2008-12-25 01:00:00
SELECT DATETRUNC(TIMESTAMP '2008-12-25 17:30:00','dd','Asia/Jakarta');
示例3:DATE参数为STRING类型
在MaxCompute1.0数据类型版本下,若date为STRING类型,且格式符合DATETIME类型的格式即yyyy-mm-dd hh:mi:ss
,则会隐式转换为DATETIME类型后参与运算。
-- 设置数据类型版本为1.0
SET odps.sql.type.system.odps2=false;
SET odps.sql.hive.compatible=false;
-- 错误示例:如下输入参数为STRING类型,但不符合DATETIME类型格式,会返回NULL。
SELECT DATETRUNC('2025-07-27 16:28:46.123','mi');
-- 返回结果。
+------------+
| _c0 |
+------------+
| NULL |
+------------+
-- 正确示例:如下输入参数为STRING类型,符合DATETIME类型格式。
SELECT DATETRUNC('2025-07-27 16:28:46', 'mi');
-- 返回结果。
+---------------------+
| _c0 |
+---------------------+
| 2025-07-27 16:28:00 |
+---------------------+
相关函数
DATETRUNC函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数。