MaxCompute SQL提供了常见的日期函数,您可以根据实际需要选择合适的日期函数,完成日期计算、日期转换。本文为您提供MaxCompute SQL支持的日期函数的命令格式、参数说明及示例,指导您使用日期函数完成开发。

函数 功能
DATEADD 按照指定的单位和幅度修改日期值。
DATE_ADD 按照指定的幅度增减天数,与date_sub的增减逻辑相反。
DATE_SUB 按照指定的幅度增减天数,与date_add的增减逻辑相反。
DATEDIFF 计算两个日期的差值并按照指定的单位表示。
DATEPART 提取日期中符合指定时间单位的字段值。
DATETRUNC 提取日期按照指定时间单位截取后的值。
FROM_UNIXTIME 将数字型的UNIX值转换为日期值。
GETDATE 获取当前系统时间。
ISDATE 判断一个日期字符串能否根据指定的格式串转换为一个日期值。
LASTDAY 获取日期所在月的最后一天。
TO_DATE 将指定格式的字符串转换为日期值。
TO_CHAR 将日期按照指定格式转换为字符串。
UNIX_TIMESTAMP 将日期转换为整型的UNIX格式的日期值。
WEEKDAY 返回日期值是当前周的第几天。
WEEKOFYEAR 返回日期值位于当年的第几周。
ADD_MONTHS 计算日期值增加指定月数后的日期。
CURRENT_TIMESTAMP 返回当前TIMESTAMP类型的时间戳。
DAY 返回日期值的天。
DAYOFMONTH 返回日部分的值。
EXTRACT 获取日期TIMESTAMP中指定单位的部分。
FROM_UTC_TIMESTAMP 将一个UTC时区的时间戳转换为一个指定时区的时间戳。
HOUR 返回日期小时部分的值。
LAST_DAY 返回日期值所在月份的最后一天日期。
MINUTE 返回日期分钟部分的值。
MONTH 返回日期值所属月份。
MONTHS_BETWEEN 返回指定日期值间的月数。
NEXT_DAY 返回大于日期值且与指定周相匹配的第一个日期。
QUARTER 返回日期值所属季度。
SECOND 返回日期秒数部分的值。
TO_MILLIS 将指定日期转换为以毫秒为单位的UNIX时间戳。
YEAR 返回日期值的年。

DATEADD

  • 命令格式
    datetime dateadd(date|datetime|timestamp <date>, bigint <delta>, string <datepart>)
  • 命令说明

    按照指定的单位datepart和幅度delta修改date的值。如果您需要获取在当前时间基础上指定变动幅度的日期,请结合GETDATE函数使用。

  • 参数说明
    • date:必填。日期值,DATE、DATETIME或TIMESTAMP类型。

      如果参数为STRING类型,格式符合DATETIME类型的格式,即yyyy-mm-dd hh:mi:ss,例如2021-08-28 00:00:00,且MaxCompute项目的数据类型版本是1.0,则会隐式转换为DATETIME类型后参与运算。

    • delta:必填。修改幅度,BIGINT类型。如果delta大于0,则增,否则减。

      如果参数为STRING或DOUBLE类型,则会隐式转换为BIGINT类型后参与运算。

      说明
      • 按照指定的单位增减delta时,会导致更高单位的进位或退位。年、月、时、分秒分别按照10进制、12进制、24进制、60进制进行计算。
      • delta的单位是月时,如果delta的月部分在增加delta值之后不造成Day溢出,则保持Day值不变,否则将Day值设置为结果月份的最后1天。
    • datepart:必填。指定修改的单位,STRING类型常量。非常量、不支持的格式或其他类型会返回报错。

      此字段的取值遵循STRING与DATETIME类型转换的约定,即yyyy表示年,mm表示月,dd表示天。关于类型转换的规则,详情请参见数据类型转换。该字段也支持扩展的日期格式:年-year、月-month-mon、日-day和小时-hour

  • 返回值说明
    返回DATETIME类型。返回规则如下:
    • date非DATE、DATETIME或TIMESTAMP类型时,返回报错。
    • date值为NULL时,返回报错。
    • deltadatepart值为NULL时,返回NULL。
  • 示例
    • 示例1:常见用法。
      --返回2005-03-01 00:00:00。加1天,结果超出当年2月份的最后一天,实际值为下个月的第1天。
      select dateadd(datetime '2005-02-28 00:00:00', 1, 'dd');
      --返回2005-02-27 00:00:00。减1天。
      select dateadd(datetime '2005-02-28 00:00:00', -1, 'dd');
      --返回2006-10-28 00:00:00。加20个月,月份溢出,年份加1。
      select dateadd(datetime '2005-02-28 00:00:00', 20, 'mm');
      --返回2005-03-28 00:00:00。
      select dateadd(datetime '2005-02-28 00:00:00', 1, 'mm');
      --返回2005-02-28 00:00:00。2005年2月没有29日,日期截取至当月最后1天。
      select dateadd(datetime '2005-01-29 00:00:00', 1, 'mm');
      --返回2005-02-28 00:00:00。
      select dateadd(datetime '2005-03-30 00:00:00', -1, 'mm');
      --返回2005-03-18。
      select dateadd(date '2005-02-18', 1, 'mm');
      --返回2005-03-18 00:00:00.0。
      set odps.sql.type.system.odps2=true;
      select dateadd(timestamp '2005-02-18 00:00:00', 1, 'mm');
      --假设当前时间为2020-11-17 16:31:44,返回2020-11-16 16:31:44。
      select dateadd(getdate(),-1,'dd');
      --返回NULL。
      select dateadd(date '2005-02-18', 1, null);
    • 示例2:用常量表示。
      在MaxCompute SQL中,DATETIME类型没有直接的常量表示方式,错误命令示例如下:
      select dateadd(2005-03-30 00:00:00, -1, 'mm');
      如果需要描述DATETIME类型的常量,正确命令示例如下:
      --将STRING类型常量显式转换为DATETIME类型,返回2005-02-28 00:00:00。
      select dateadd(cast("2005-03-30 00:00:00" as datetime), -1, 'mm');
    • 示例3:输入参数为STRING类型。
      --如下输入参数为STRING类型,但不符合DATETIME类型格式,会返回报错。
      select dateadd('2021-08-27',1,'dd');
      --如下输入参数为STRING类型,符合DATETIME类型格式,且MaxCompute项目的数据类型版本为1.0,返回2005-03-01 00:00:00。
      set odps.sql.type.system.odps2=false;
      set odps.sql.hive.compatible=false; 
      select dateadd('2005-02-28 00:00:00', 1, 'dd');

DATE_ADD

  • 命令格式
    date date_add(date|timestamp|string <startdate>, bigint <delta>)
  • 命令说明

    按照delta幅度增减startdate日期的天数。如果您需要获取在当前时间基础上指定变动幅度的日期,请结合GETDATE函数使用。

    本命令与DATE_SUB的增减逻辑相反。

  • 参数说明
    • startdate:必填。起始日期值。支持DATE、DATETIME或STRING类型。

      如果参数为STRING类型,则会隐式转换为DATE类型后参与运算,且STRING参数格式必须为'yyyy-mm-dd'。例如'2019-12-27'

    • delta:必填。修改幅度。BIGINT类型。如果delta大于0,则delta小于0,则delta等于0,不增不减。
  • 返回值说明
    返回DATE类型。返回规则如下:
    • startdate非DATE、DATETIME或STRING类型时,返回报错。
    • startdate值为NULL时,返回报错。
    • delta值为NULL时,返回NULL。
  • 示例
    --开启2.0新类型。此命令需要与SQL语句一起提交。
    set odps.sql.type.system.odps2=true;
    --返回2005-03-01。加1天,结果超出当年2月份的最后1天,实际值为下个月的第1天。
    select date_add(datetime '2005-02-28 00:00:00', 1);
    --返回2005-02-27。减1天。
    select date_add(date '2005-02-28', -1);
    --返回2005-03-20。
    select date_add('2005-02-28 00:00:00', 20);
    --假设当前时间为2020-11-17 16:31:44,返回2020-11-16。
    select date_add(getdate(),-1);
    --返回NULL。
    select date_add('2005-02-28 00:00:00', null);

DATE_SUB

  • 命令格式
    date date_sub(date|timestamp|string <startdate>, bigint <delta>)
  • 命令说明

    按照delta幅度增减startdate日期的天数。如果您需要获取在当前时间基础上指定变动幅度的日期,请结合GETDATE函数使用。

    本命令与DATE_ADD的增减逻辑相反。

  • 参数说明
    • startdate:必填。起始日期值。支持DATE、DATETIME或STRING类型。

      如果参数为STRING类型,则会隐式转换为DATE类型后参与运算,且STRING参数格式必须为'yyyy-mm-dd'。例如'2019-12-27'

    • delta:必填。修改幅度。BIGINT类型。如果delta大于0,则delta小于0,则delta等于0,不增不减。
  • 返回值说明
    返回DATE类型。返回规则如下:
    • startdate非DATE、DATETIME或STRING类型时,返回报错。
    • startdate值为NULL时,返回报错。
    • delta值为NULL时,返回NULL。
  • 示例
    --开启2.0新类型。此命令需要与SQL语句一起提交。
    set odps.sql.type.system.odps2=true;
    --返回2005-02-28。减1天,实际值为上个月的最后1天。
    select date_sub(datetime '2005-03-01 00:00:00', 1);
    --返回2005-03-01。增1天。
    select date_sub(date '2005-02-28', -1);
    --返回2005-02-27。减2天。
    select date_sub('2005-03-01 00:00:00', 2);
    --假设当前时间为2021-09-10 16:31:44,返回2020-09-09。
    select date_sub(getdate(),1);
    --返回NULL。
    select date_sub('2005-03-01 00:00:00', null);

DATEDIFF

  • 命令格式
    bigint datediff(date|datetime|timestamp <date1>, date|datetime|timestamp <date2>, string <datepart>)
  • 命令说明

    计算两个时间date1date2的差值,将差值以指定的时间单位datepart表示。

  • 参数说明
    • date1date2:必填。DATE、DATETIME或TIMESTAMP类型。被减数和减数。如果输入为STRING类型,则会隐式转换为DATETIME类型后参与运算。
    • datepart:可选。时间单位,STRING类型常量。

      如果您打开了MaxCompute新数据类型开关,可以不填写datepart参数,默认日期格式为天。该字段也支持扩展的日期格式:年-year、月-month-mon、日-day和小时-hour

      说明 系统计算时会按照datepart切掉低单位部分,然后再计算结果。
  • 返回值说明
    返回BIGINT类型。返回规则如下:
    • date1date2非DATE、DATETIME或TIMESTAMP类型时,返回报错。
    • 如果date1小于date2,返回值为负数。
    • date1date2值为NULL时,返回NULL。
    • datepart值为NULL时,返回NULL。
  • 示例
    --假设start=2005-12-31 23:59:59,end=2006-01-01 00:00:00,则:
        --返回1。
        select datediff(end, start, 'dd'); 
        --返回1。
        select datediff(end, start, 'mm');
        --返回1。
        select datediff(end, start, 'yyyy');
        --返回1。
        select datediff(end, start, 'hh');
        --返回1。
        select datediff(end, start, 'mi');
        --返回1。
        select datediff(end, start, 'ss');
    --返回1800。
    select datediff(datetime'2013-05-31 13:00:00', '2013-05-31 12:30:00', 'ss');
    --返回30。
    select datediff(datetime'2013-05-31 13:00:00', '2013-05-31 12:30:00', 'mi');
    --返回11。
    select datediff(date '2013-05-21', date '2013-05-10', 'dd');
    --返回1800。
    set odps.sql.type.system.odps2=true;
    select datediff(timestamp '2013-05-31 13:00:00', timestamp '2013-05-31 12:30:00', 'ss');
    --假设start = 2018-06-04 19:33:23.234,end = 2018-06-04 19:33:23.250,含毫秒的日期不属于标准DATETIME式样,不能直接隐式转换,此处需进行显示转换。返回16。
    select datediff(to_date('2018-06-04 19:33:23.250', 'yyyy-mm-dd hh:mi:ss.ff3'), to_date('2018-06-04 19:33:23.234', 'yyyy-mm-dd hh:mi:ss.ff3') , 'ff3');
    --返回NULL。
    select datediff(date '2013-05-21', date '2013-05-10', null);
    --返回NULL。
    select datediff(date '2013-05-21', null, 'dd');

DATEPART

  • 命令格式
    bigint datepart(date|datetime|timestamp <date>, string <datepart>)
  • 命令说明

    提取日期date中符合指定时间单位datepart的值。

  • 参数说明
    • date:必填。DATE、DATETIME或TIMESTAMP类型。如果输入为STRING类型,则会隐式转换为DATETIME类型后参与运算。
    • datepart:必填。STRING类型常量,支持扩展的日期格式。

      此字段的取值遵循STRING与DATETIME类型转换的约定,即yyyy表示年,mm表示月,dd表示天。关于类型转换的规则,详情请参见数据类型转换。该字段也支持扩展的日期格式:年-year、月-month-mon、日-day和小时-hour

  • 返回值说明
    返回BIGINT类型。返回规则如下:
    • date非DATE、DATETIME或TIMESTAMP类型时,返回报错。
    • date值为NULL时,返回报错。
    • datepart值为NULL时,返回NULL。
  • 示例
    --返回2013。
    select datepart(datetime'2013-06-08 01:10:00', 'yyyy'); 
    --返回6。
    select datepart(datetime'2013-06-08 01:10:00', 'mm');
    --返回2013。
    select datepart(date '2013-06-08', 'yyyy');
    --返回2013。
    set odps.sql.type.system.odps2=true;
    select datepart(timestamp '2013-06-08 01:10:00', 'yyyy');
    --返回NULL。
    select datepart(date '2013-06-08', null);

DATETRUNC

  • 命令格式
    datetime datetrunc (date|datetime|timestamp <date>, string <datepart>)
  • 命令说明

    返回将日期date按照datepart指定的时间单位进行截取后的日期值。

  • 参数说明
    • date:必填。DATE、DATETIME或TIMESTAMP类型。如果输入为STRING类型,则会隐式转换为DATETIME类型后参与运算。
    • datepart:必填。STRING类型常量。支持扩展的日期格式。

      此字段的取值遵循STRING与DATETIME类型转换的约定,即yyyy表示年,mm表示月,dd表示天。关于类型转换的规则,详情请参见数据类型转换。该字段也支持扩展的日期格式:年-year、月-month-mon、日-day和小时-hour

  • 返回值说明
    DATETIME类型。返回规则如下:
    • date非DATE、DATETIME或TIMESTAMP类型时,返回报错。
    • date值为NULL时,返回报错。
    • datepart值为NULL时,返回NULL。
  • 示例
    --返回2011-01-01 00:00:00。
    select datetrunc(datetime'2011-12-07 16:28:46', 'yyyy');
    --返回2011-12-01 00:00:00。
    select datetrunc(datetime'2011-12-07 16:28:46', 'month');
    --返回2011-12-07 00:00:00。
    select datetrunc(datetime'2011-12-07 16:28:46', 'DD');
    --返回2011-01-01。
    select datetrunc(date '2011-12-07', 'yyyy');
    --返回2011-01-01 00:00:00.0。
    set odps.sql.type.system.odps2=true;
    select datetrunc(timestamp '2011-12-07 16:28:46', 'yyyy');
    --返回NULL。
    select datetrunc(date '2011-12-07', null);

FROM_UNIXTIME

  • 命令格式
    datetime from_unixtime(bigint <unixtime>)
  • 命令说明

    将数字型的UNIX时间日期值unixtime转为日期值。

  • 参数说明

    unixtime:必填。BIGINT类型,秒数,UNIX格式的日期时间值。如果输入为STRING、DOUBLE或DECIMAL类型,则会隐式转换为BIGINT后参与运算。

  • 返回值说明
    返回DATETIME类型的日期值。unixtime值为NULL时,返回NULL。
    说明 Hive兼容模式下(set odps.sql.hive.compatible=true;),如果输入参数是STRING类型,返回值也是STRING类型。
  • 示例
    --返回1973-11-30 05:33:09。
    select from_unixtime(123456789);
    --返回NULL。
    select from_unixtime(null);

GETDATE

  • 命令格式
    datetime getdate()
  • 命令说明

    获取当前系统时间。使用东八区时间作为MaxCompute标准时间。

  • 返回值说明

    返回当前日期和时间,DATETIME类型。

    说明 在MaxCompute SQL中,getdate总是返回一个固定的值。返回结果会是MaxCompute SQL执行期间的任意时间,时间精度精确到秒。如果开启了新数据类型2.0,时间精度精确到毫秒。

ISDATE

  • 命令格式
    boolean isdate(string <date>, string <format>)
  • 命令说明

    判断一个日期字符串能否根据指定的格式串转换为一个日期值。如果能转换成功,返回True;否则返回False。

  • 参数说明
    • date:必填。STRING类型。如果输入为BIGINT、DOUBLE、DECIMAL或DATETIME类型,会隐式转换为STRING类型后参与运算。
    • format:必填。STRING类型常量,不支持日期扩展格式。如果format中出现多余的格式串,则只取第一个格式串对应的日期数值,其余的会被视为分隔符。例如isdate("1234-yyyy", "yyyy-yyyy"),会返回True。
  • 返回值说明

    返回BOOLEAN类型。dateformat值为NULL时,返回NULL。

LASTDAY

  • 命令格式
    datetime lastday(datetime <date>)
  • 命令说明

    date所在月的最后一天,截取到天,时分秒部分为00:00:00

  • 参数说明

    date:DATETIME类型日期值,格式为yyyy-mm-dd hh:mi:ss。如果输入为STRING类型,则会隐式转换为DATETIME类型后参与运算。

  • 返回值说明
    返回DATETIME类型。返回规则如下:
    • date非DATETIME或STRING类型,或格式不符合要求时,会返回报错。
    • date值为NULL时,返回NULL。
  • 示例
    --返回2013-06-30 00:00:00。
    select lastday (datetime '2013-06-08 01:10:00');
    --返回NULL。
    select lastday (null);

TO_DATE

  • 命令格式
    datetime to_date(string <date>, string <format>)
  • 命令说明

    date转换成符合format格式的日期值。

  • 参数说明
    • date:必填。STRING类型,要转换的字符串格式的日期值。如果输入为BIGINT、DOUBLE、DECIMAL或DATETIME类型,则会隐式转换为STRING类型后参与运算。
    • format:必填。STRING类型常量,日期格式。format不支持日期扩展格式,其他字符在解析时当作无用字符忽略。

      format:参数至少包含yyyy,否则会返回NULL。如果format中出现多余的格式串,则只取第一个格式串对应的日期数值,其余的会被视为分隔符。例如to_date("1234-2234", "yyyy-yyyy")会返回1234-01-01 00:00:00

      format格式:yyyy为4位数的年,mm为2位数的月,dd为2位数的日,hh为24小时制的时,mi为2位数的分钟,ss为2位数秒,ff3为3位精度毫秒。

  • 返回值说明

    返回DATETIME类型,格式为yyyy-mm-dd hh:mi:ssdateformat值为NULL时,返回NULL。

  • 示例
    --返回2010-12-03 00:00:00。
    select to_date('阿里巴巴2010-12*03', '阿里巴巴yyyy-mm*dd');
    --返回2008-07-18 00:00:00。
    select to_date('20080718', 'yyyymmdd');
    --返回2008-07-18 20:30:00。
    select to_date('200807182030','yyyymmddhhmi');
    --'2008718'无法转为标准日期值,引发异常,应该为'20080718'。
    select to_date('2008718', 'yyyymmdd');
    --'阿里巴巴2010-12*3'无法转为标准日期值,引发异常,应该为'阿里巴巴2010-12*03'。
    select to_date('阿里巴巴2010-12*3', '阿里巴巴yyyy-mm*dd');
    --'2010-24-01'无法转为标准日期值,引发异常,应该为'2010-01-24'。
    select to_date('2010-24-01', 'yyyy');
    --返回2018-10-30 15:13:12.
    select to_date('20181030 15-13-12.345','yyyymmdd hh-mi-ss.ff3');
    --返回NULL。
    select to_date(null,'yyyymmdd hh-mi-ss.ff3');
    --返回NULL。
    select to_date('20181030 15-13-12.345',null);

TO_CHAR

  • 命令格式
    string to_char(datetime <date>, string <format>)
  • 命令说明

    将日期类型date按照format指定的格式转成字符串。

  • 参数说明
    • date:必填。DATETIME类型日期值,格式为yyyy-mm-dd hh:mi:ss。如果输入为STRING类型,会隐式转换为DATETIME类型后参与运算。
    • format:必填。STRING类型常量。format中的日期格式部分会被替换成相应的数据,其他字符直接输出。
  • 返回值说明
    返回STRING类型。返回规则如下:
    • date非DATETIME或STRING类型时,返回报错。
    • date值为NULL时,返回报错。
    • format值为NULL时,返回NULL。
  • 示例
    --返回阿里金融2010-12*03。需要注意在Windows环境的MaxCompute客户端运行时返回结果中的中文字符显示存在问题。
    select to_char(datetime'2010-12-03 00:00:00', '阿里金融yyyy-mm*dd');
    --返回20080718。
    select to_char(datetime'2008-07-18 00:00:00', 'yyyymmdd');
    --'阿里巴巴2010-12*3'无法转换为符合要求的格式,会引发异常,应该为'阿里巴巴2010-12*03'。
    select to_char(datetime'阿里巴巴2010-12*3', '阿里巴巴yyyy-mm*dd');
    --'2010-24-01'不是标准日期值,引发异常,应该为'2010-01-24'。
    select to_char(datetime'2010-24-01', 'yyyy');
    --'2008718'不是标准日期值,引发异常,应该为'20080718'。
    select to_char(datetime'2008718', 'yyyymmdd');
    --返回NULL。
    select to_char(datetime'2010-12-03 00:00:00', null);

UNIX_TIMESTAMP

  • 命令格式
    bigint unix_timestamp(datetime|date|timestamp|string <date>)
  • 命令说明

    将日期date转化为整型的UNIX格式的日期时间值。

  • 参数说明

    date:必填。DATETIME、DATE、TIMESTAMP或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。如果输入为STRING类型,则会隐式转换为DATETIME类型后参与运算。当打开新数据类型属性时,隐式转换会失败,此时需要通过cast函数转换,例如unix_timestamp(cast(... as datetime))

  • 返回值说明
    返回BIGINT类型,表示UNIX格式日期值。返回规则如下:
    • date非DATETIME、DATE、TIMESTAMP或STRING类型,或格式不符合要求时,返回报错。
    • date值为NULL时,返回NULL。
  • 示例
    --返回1237518660。
    select unix_timestamp(datetime'2009-03-20 11:11:00'); 
    --返回NULL。
    select unix_timestamp(null);

WEEKDAY

  • 命令格式
    bigint weekday (datetime <date>)
  • 命令说明

    返回date日期是当前周的第几天。

  • 参数说明

    date:必填。DATETIME类型日期值。格式为yyyy-mm-dd hh:mi:ss

  • 返回值说明
    返回BIGINT类型。返回规则如下:
    • 周一作为一周的第一天,返回值为0。其他日期依次递增,周日返回6。
    • date非DATETIME类型,或格式不符合要求时,返回报错。
    • date值为NULL时,返回NULL。
  • 示例
    --返回4。
    select weekday (datetime '2009-03-20 11:11:00');
    --返回NULL。
    select weekday (null);

WEEKOFYEAR

  • 命令格式
    bigint weekofyear (datetime <date>)
  • 命令说明
    返回日期date位于那一年的第几周。周一作为一周的第一天。
    说明 这一周算上一年还是下一年,取决于这一周的大多数日期(4天以上)在哪一年。算在前一年,就是前一年的最后一周;算在后一年就是后一年的第一周。
  • 参数说明

    date:必填。DATETIME类型日期值。格式为yyyy-mm-dd hh:mi:ss

  • 返回值说明
    返回BIGINT类型。返回规则如下:
    • date非DATETIME类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回1。虽然20141229属于2014年,但是这一周的大多数日期是在2015年,因此返回结果为1,表示是2015年的第一周。
    select weekofyear(to_date("20141229", "yyyymmdd"));  
    --返回1。    
    select weekofyear(to_date("20141231", "yyyymmdd")); 
    --返回53。 
    select weekofyear(to_date("20151229", "yyyymmdd"));
    --返回NULL。
    select weekofyear('20141231');
    --返回NULL。
    select weekofyear(null);

MaxCompute 2.0扩展函数

升级到MaxCompute 2.0后,产品扩展了部分函数。如果您用到的函数涉及新数据类型(TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP或BINARY),在使用扩展函数时,需要执行如下语句开启新数据类型开关:
  • Session级别:如果使用新数据类型,您需要在SQL语句前加上语句set odps.sql.type.system.odps2=true;,并与SQL语句一起提交执行。
  • Project级别:Project Owner可根据需要对Project进行设置,等待10~15分钟后才会生效。命令如下。
    setproject odps.sql.type.system.odps2=true;
    setproject的详细说明请参见项目空间操作。关于开启Project级别数据类型的注意事项,请参见数据类型版本说明

ADD_MONTHS

  • 命令格式
    string add_months(date|timestamp|string <startdate>, int <num_months>)
  • 命令说明

    返回开始日期startdate增加num_months个月后的日期。此函数为MaxCompute 2.0扩展函数。

  • 参数说明
    • startdate:必填。DATE、TIMESTAMP或STRING类型,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。
    • num_months:必填。INT型数值。
  • 返回值说明
    返回STRING类型的日期值,格式为yyyy-mm-dd。返回规则如下:
    • startdate非DATE、TIMESTAMP或STRING类型,或格式不符合要求时,返回NULL。
    • startdate值为NULL时,返回报错。
    • num_months值为NULL时,返回NULL。
  • 示例
    --返回2017-05-14。
    select add_months('2017-02-14',3);
    --返回0017-05-14。
    select add_months('17-2-14',3);
    --返回2017-05-14。
    select add_months('2017-02-14 21:30:00',3);
    --返回NULL。
    select add_months('20170214',3);
    --返回NULL。
    select add_months('2017-02-14 21:30:00',null);

CURRENT_TIMESTAMP

  • 命令格式
    timestamp current_timestamp()
  • 命令说明

    返回当前TIMESTAMP类型的时间戳,值不固定。此函数为MaxCompute 2.0扩展函数。

  • 返回值说明

    返回TIMESTAMP类型。

  • 示例
    --返回'2017-08-03 11:50:30.661'。
    set odps.sql.type.system.odps2=true;
    select current_timestamp(); 

DAY

  • 命令格式
    int day(datetime|timestamp|date|string <date>)
  • 命令说明

    返回一个日期的天。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP、DATE或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回1。
    select day('2014-09-01');
    --返回NULL。
    select day('20140901');
    --返回NULL。
    select day(null);

DAYOFMONTH

  • 命令格式
    int dayofmonth(datetime|timestamp|date|string <date>)
  • 命令说明

    返回日期日部分的值。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP、DATE或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回1。
    select dayofmonth('2014-09-01');
    --返回NULL。
    select dayofmonth('20140901');
    --返回NULL。
    select dayofmonth(null);

EXTRACT

  • 命令格式
    int extract(<datepart> from <timestamp>)
  • 命令说明

    提取日期timestamp中指定单位datepart的部分。此函数为MaxCompute 2.0扩展函数。

  • 参数说明
    • datepart:必填。支持YEAR、MONTH、DAY、HOUR或MINUTE等时间取值。
    • timestamp:必填。TIMESTAMP类型日期。
  • 返回值
    返回INT类型。返回规则如下:
    • datepart非YEAR、MONTH、DAY、HOUR或MINUTE等时间取值时,返回报错。
    • datepart值为NULL时,返回报错。
    • timestamp值为NULL时,返回NULL。
  • 示例
    set odps.sql.type.system.odps2=true;
    select  extract(year from '2019-05-01 11:21:00') year
             ,extract(month from '2019-05-01 11:21:00') month
             ,extract(day from '2019-05-01 11:21:00') day
             ,extract(hour from '2019-05-01 11:21:00') hour
             ,extract(minute from '2019-05-01 11:21:00') minute;
    --返回值如下。
    +------+-------+------+------+--------+
    | year | month | day  | hour | minute |
    +------+-------+------+------+--------+
    | 2019 | 5     | 1    | 11   | 21     |
    +------+-------+------+------+--------+
    --返回NULL。
    select  extract(year from null);

FROM_UTC_TIMESTAMP

  • 命令格式
    timestamp from_utc_timestamp({any primitive type}*, string <timezone>)
  • 命令说明

    将一个UTC时区的时间戳转换成一个指定时区的时间戳。此函数为MaxCompute 2.0扩展函数。

  • 参数说明
    • {any primitive type}*:必填。时间戳,支持TIMESTAMP、DATETIME、TINYINT、SMALLINT、INT或BIGINT数据类型。如果该参数为TINYINT、SMALLINT、INT或BIGINT数据类型,则单位为毫秒。
    • timezone:必填。指定需要转换的目标时区。
      说明 您可直接在搜索引擎中查找相关时区列表详情。
  • 返回值说明
    返回TIMESTAMP类型。返回规则如下:
    • {any primitive type}*非TIMESTAMP、DATETIME、TINYINT、SMALLINT、INT或BIGINT时,返回报错。
    • {any primitive type}*值为NULL时,返回报错。
    • timezone值为NULL时,返回NULL。
  • 示例
    --输入参数为毫秒(ms),返回2017-08-01 04:24:00.0。
    select from_utc_timestamp(1501557840000, 'PST'); 
    --返回1970-01-30 08:00:00.0。
    select from_utc_timestamp('1970-01-30 16:00:00','PST'); 
    --返回1970-01-29 16:00:00.0。
    select from_utc_timestamp('1970-01-30','PST'); 
    --返回2011-12-25 17:00:00.123。
    set odps.sql.type.system.odps2=true;
    select from_utc_timestamp(timestamp '2011-12-25 09:00:00.123456', 'Asia/Shanghai');
    --返回2011-12-25 01:55:00.0。
    set odps.sql.type.system.odps2=true;
    select from_utc_timestamp(timestamp '2011-12-25 06:55:00', 'America/Toronto');
    --返回NULL。
    select from_utc_timestamp('1970-01-30',null);

HOUR

  • 命令格式
    int hour(datetime|timestamp|string <date>)
  • 命令说明

    返回日期小时部分的值。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。此函数为MaxCompute 2.0扩展函数。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回12。
    select hour('2014-09-01 12:00:00');
    --返回12。
    select hour('12:00:00');
    --返回NULL。
    select hour('20140901120000');
    --返回NULL。
    select hour(null);

LAST_DAY

  • 命令格式
    string last_day(date|timestamp|string <date>)
  • 命令说明

    返回该日期所在月份的最后一天日期。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATE、TIMESTAMP或STRING类型日期值。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回STRING类型的日期值,格式为yyyy-mm-dd。返回规则如下:
    • date非DATE、TIMESTAMP或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回报错。
  • 示例
    --返回2017-03-31。
    select last_day('2017-03-04');
    --返回2017-07-31。
    select last_day('2017-07-04 11:40:00');
    --返回NULL。
    select last_day('20170304');

MINUTE

  • 命令格式
    int minute(datetime|timestamp|string <date>)
  • 命令说明

    返回日期分钟部分的值。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回30。
    select minute('2014-09-01 12:30:00'); 
    --返回30。
    select minute('12:30:00');
    --返回NULL。
    select minute('20140901120000');
    --返回NULL。
    select minute(null);

MONTH

  • 命令格式
    int month(datetime|timestamp|date|string <date>)
  • 命令说明

    返回一个日期的月份。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP、DATE或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回9。
    select month('2014-09-01');
    --返回NULL。
    select month('20140901');
    --返回NULL。
    select month(null);

MONTHS_BETWEEN

  • 命令格式
    double months_between(datetime|timestamp|date|string <date1>, datetime|timestamp|date|string <date2>)
  • 命令说明

    返回日期date1date2之间的月数。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date1date2:必填。DATETIME、TIMESTAMP、DATE或STRING类型,格式为yyyy-mm-dd hh:mi:ssyyyy-mm-dd。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回DOUBLE类型。返回规则如下:
    • date1晚于date2时,返回值为正。当date2晚于date1时,返回值为负。
    • date1date2分别对应两个月的最后一天,返回整数月;否则计算方式为date1减去date2的天数除以31天。
    • date1date2值为NULL时,返回NULL。
  • 示例
    --返回3.9495967741935485。
    select months_between('1997-02-28 10:30:00', '1996-10-30');
    --返回-3.9495967741935485。
    select months_between('1996-10-30','1997-02-28 10:30:00' );
    --返回-3.0。
    select months_between('1996-09-30','1996-12-31');
    --返回NULL。
    select months_between('1996-09-30',null);

NEXT_DAY

  • 命令格式
    string next_day(timestamp|date|string <startdate>, string <week>)
  • 命令说明

    返回大于指定日期startdate并且与week相匹配的第一个日期,即下周几的具体日期。此函数为MaxCompute 2.0扩展函数。

  • 参数说明
    • startdate:必填。TIMESTAMP、DATE或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。
    • week:必填。STRING类型,一个星期前2个或3个字母,或者一个星期的全名。例如MO、TUE或FRIDAY。
  • 返回值说明
    返回STRING类型的日期值,格式为yyyy-mm-dd。返回规则如下:
    • date非TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回报错。
    • week值为NULL时,返回NULL。
  • 示例
    --返回2017-08-08。
    select next_day('2017-08-01','TU');
    --返回2017-08-08。
    select next_day('2017-08-01 23:34:00','TU');
    --返回NULL。
    select next_day('20170801','TU');
    --返回NULL。
    select next_day('2017-08-01 23:34:00',null);

QUARTER

  • 命令格式
    int quarter (datetime|timestamp|date|string <date>)
  • 命令说明

    返回一个日期的季度,范围是1~4。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP、DATE或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回4。
    select quarter('1970-11-12 10:00:00');
    --返回4。
    select quarter('1970-11-12');
    --返回NULL。
    select quarter(null);

SECOND

  • 命令格式
    int second(datetime|timestamp|string <date>)
  • 命令说明

    返回日期秒数部分的值。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值说明
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回45。
    select second('2014-09-01 12:30:45');
    --返回45。
    select second('12:30:45');
    --返回NULL。
    select second('20140901123045');
    --返回NULL。
    select second(null);

TO_MILLIS

  • 命令格式
    bigint to_millis(datetime|timestamp <date>);
  • 命令说明

    将给定日期date转换为以毫秒为单位的UNIX时间戳。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME或TIMESTAMP类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss

  • 返回值说明
    返回BIGINT类型。返回规则如下:
    • date非DATETIME或TIMESTAMP类型时,返回报错。
    • date值为NULL时,返回报错。
  • 示例
    --返回1617174900000。
    select to_millis(datetime '2021-03-31 15:15:00');
    --返回1617174900000。
    set odps.sql.type.system.odps2=true;
    select to_millis(timestamp '2021-03-31 15:15:00');

YEAR

  • 命令格式
    int year(datetime|timestamp|date|string <date>)
  • 命令说明

    返回日期date的年。此函数为MaxCompute 2.0扩展函数。

  • 参数说明

    date:必填。DATETIME、TIMESTAMP、DATE或STRING类型日期值,格式为yyyy-mm-ddyyyy-mm-dd hh:mi:ss。取值为STRING类型格式时,至少要包含yyyy-mm-dd且不含多余的字符串。

  • 返回值
    返回INT类型。返回规则如下:
    • date非DATETIME、TIMESTAMP、DATE或STRING类型,或格式不符合要求时,返回NULL。
    • date值为NULL时,返回NULL。
  • 示例
    --返回1970。
    select year('1970-01-01 12:30:00');
    --返回1970。
    select year('1970-01-01');
    --返回70。
    select year('70-01-01');
    --返回NULL。
    select year('1970/03/09'); 
    --返回NULL。
    select year(null);