DATEDIFF函数用于计算date1、date2的差值,将差值以指定的时间单位datepart表示。
命令格式
BIGINT|INT DATEDIFF(STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date1>, STRING|DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date2>[, STRING <datepart>])
参数说明
date1、date2:必填。日期或时间戳,支持STRING、DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型。分别是被减数和减数。
如果输入为STRING类型,其日期格式需包含
yyyy-mm-dd
,且不支持指定datepart参数。说明在MaxCompute1.0数据类型版本下,若date1、date2为STRING类型,时间格式符合DATETIME类型的格式,即
yyyy-mm-dd hh:mi:ss
,例如2021-08-28 00:00:00
,则会隐式转换为DATETIME类型后参与运算。datepart:可选。指定返回值的时间单位,若未指定,则默认为天。STRING类型常量。支持以下取值:
时间单位
取值
年
year
或yyyy
月
month
或mon
或mm
周
week
或week(weekday)
ISO周
isoweek
日
day
或dd
小时
hour
或hh
分钟
mi
秒
ss
毫秒
ff3
微秒
ff6
说明系统计算时会先按照datepart切掉低单位部分,然后再计算结果。若设置
SET odps.sql.bigquery.compatible=true;
系统计算时会先计算差值,再以指定的时间单位datepart表示。week
是以周一为一周的第一天,等效于week(weekday)
。week(weekday)
周从指定的星期几(weekday)
开始算起。weekday
的有效值为:周日(SUNDAY)、周一(MONDAY)、周二(TUESDAY)、周三(WEDNESDAY)、周四(THURSDAY)、周五(FRIDAY)以及周六(SATURDAY)。isoweek
采用ISO 8601所规定的周边界。ISO标准下的周从周一开始算起
返回值说明
返回BIGINT或INT类型。返回规则如下:
若使用datepart,则返回BIGINT类型;若未使用datepart,则返回INT类型。
date1、date2非STRING、DATE、DATETIME、TIMESTAMP或TIMESTAMP_NTZ类型时,返回报错。
如果date1小于date2,返回值为负数。
date1、date2或datepart值为NULL时,返回NULL。
使用示例
示例1:静态数据常见用法
-- 返回 -86400000000
SELECT DATEDIFF(DATE "2025-03-01", DATE '2025-03-02', 'ff6');
-- 返回 -640815000
SELECT DATEDIFF(TIMESTAMP "2025-03-07 15:30:00.123", TIMESTAMP "2025-03-15 01:30:15.123456", 'ff3');
-- 返回 13
SELECT DATEDIFF(DATETIME "2025-07-01 00:00:00", DATETIME '2025-03-28 01:30:09', 'week(friday)');
-- 返回 20
SELECT DATEDIFF(TIMESTAMP_NTZ "2025-06-07 10:30:00.123", TIMESTAMP_NTZ "2025-01-15 00:30:45.123456", 'isoweek');
示例2:时间差计算模式切换
系统计算时会按照datepart切掉低单位部分,然后再计算结果。若设置SET odps.sql.bigquery.compatible=true;
系统计算时会先计算差值,再以指定的时间单位datepart表示。
-- 返回 5
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi' ) AS diff_in_minute1;
-- 返回 4
SET odps.sql.bigquery.compatible=true;
SELECT DATEDIFF(CAST('2024-11-01 10:05:05' AS TIMESTAMP), CAST('2024-11-01 10:00:10' AS TIMESTAMP), 'mi' ) AS diff_in_minute1;
示例3:date1、date2参数为STRING类型
在MaxCompute1.0数据类型版本下,若date1、date2为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类型,日期格式为yyyy-mm-dd,但指定datepart参数,返回NULL。 SELECT DATEDIFF('2025-07-27','2025-07-20','dd'); -- 返回结果。 +------------+ | _c0 | +------------+ | NULL | +------------+ -- 正确示例:如下输入参数为STRING类型,符合DATETIME类型格式。支持指定datepart参数 SELECT DATEDIFF("2025-07-01 00:21:00", "2025-03-28 01:30:09", 'hour'); -- 返回结果。 +------------+ | _c0 | +------------+ | 2279 | +------------+
若date1、date2为STRING类型,其日期格式需包含
yyyy-mm-dd
,且不支持指定datepart参数。MaxCompute1.0数据类型版本示例如下:
-- 设置数据类型版本为1.0 SET odps.sql.type.system.odps2=false; SET odps.sql.hive.compatible=false; -- 错误示例:如下输入参数为STRING类型,日期格式为yyyy-mm-dd,且指定datepart参数,则返回NULL。 SELECT DATEDIFF("2025-07-01", "2025-06-28",'day'); -- 正确示例:如下输入参数为STRING类型,日期格式为yyyy-mm-dd,且未指定datepart参数,默认datepart为天。 SELECT DATEDIFF("2025-07-01", "2025-06-28"); -- 返回结果。 +------+ | _c0 | +------+ | 3 | +------+
MaxCompute2.0数据类型版本示例如下:
-- 设置数据类型版本为2.0 SET odps.sql.type.system.odps2=true; SET odps.sql.hive.compatible=false; -- 错误示例:如下输入参数为STRING类型,日期格式包含yyyy-mm-dd,且指定datepart参数,则返回报错。 SELECT DATEDIFF("2025-07-01", "2025-06-28 01:30:09.123",'hour'); -- 正确示例:如下输入参数为STRING类型,日期格式包含yyyy-mm-dd,且未指定datepart参数,默认datepart为天。 SELECT DATEDIFF("2025-07-01", "2025-06-28 01:30:09.123"); -- 返回结果。 +------+ | _c0 | +------+ | 3 | +------+
相关函数
DATEDIFF函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数。