更新时间:2025-06-30 GMT+08:00

日期和时间函数

以下为GaussDB数据库M-Compatibility兼容性日期时间函数公共差异说明。

  • 当SELECT子查询中包含且仅包含时间函数,且函数入参包含表中的列时,使用算数运算符(如+、-、*、/、取反等)对结果进行运算时,会截断日期与时间函数返回值后再进行算数运算。
    m_db=# CREATE TABLE t1(int_var int);
    CREATE TABLE
    m_db=# INSERT INTO t1 VALUES(100);
    INSERT 0 1
    m_db=# SELECT (SELECT (1 * DATE_ADD('2020-10-20', interval int_var microsecond))) AS a FROM t1; -- 不进行截断处理。
           a        
    ----------------
     20201020000000
    (1 row)
    
    m_db=# SELECT (1 * (SELECT DATE_ADD('2020-10-20', interval int_var microsecond))) AS a FROM t1; -- 进行截断处理。
      a   
    ------
     2020
    (1 row)
    
    m_db=# SELECT 1 * a FROM (SELECT (SELECT 1 * DATE_ADD('2020-10-20', interval int_var microsecond)) AS a FROM t1) AS t2; -- 不进行截断处理。
         1 * a      
    ----------------
     20201020000000
    (1 row)
    
    m_db=# SELECT 1 * a FROM (SELECT (SELECT DATE_ADD('2020-10-20', interval int_var microsecond)) AS a FROM t1) AS t2; -- 进行截断处理。
     1 * a 
    -------
      2020
    (1 row)
表1 日期与和时间函数列表

函数名

与MySQL的差异

ADDDATE()

-

ADDTIME()

-

CONVERT_TZ()

-

CURDATE()

-

CURRENT_DATE()/CURRENT_DATE

-

CURRENT_TIME()/CURRENT_TIME

MySQL入参整型值会按照一字节最大值255整数回绕(例:SELECT CURRENT_TIME(257) == SELECT CURRENT_TIME(1))。

GaussDB只支持[0,6]合法值,其他值报错。

CURRENT_TIMESTAMP()/CURRENT_TIMESTAMP

CURTIME()

LOCALTIME()/LOCALTIME

LOCALTIMESTAMP/LOCALTIMESTAMP()

NOW()

SYSDATE()

UTC_TIME()

UTC_TIMESTAMP()

DATE()

-

DATE_ADD()

-

DATE_FORMAT()

-

DATE_SUB()

-

DATEDIFF()

-

DAY()

-

DAYNAME()

-

DAYOFMONTH()

-

DAYOFWEEK()

-

DAYOFYEAR()

-

EXTRACT()

-

FROM_DAYS()

-

FROM_UNIXTIME()

-

GET_FORMAT()

-

HOUR()

-

LAST_DAY()

-

MAKEDATE()

-

MAKETIME()

-

MICROSECOND()

-

MINUTE()

-

MONTH()

-

MONTHNAME()

-

PERIOD_ADD()

MySQL8.0修复了以下问题,在以下场景中该函数的行为与MySQL8.0版本保持一致:

  • 整数溢出处理的行为。

    MySQL在5.7版本,此函数入参和结果的最大值都为2^32=4294967296,在入参或结果的period对应的月份累加值以及month_number超过uint32范围时存在整数回绕问题

  • 负数period的表现。

    MySQL在5.7版本,会将负数年份解析为异常值而不是报错。GaussDB入参或结果(如100年1月减去10000月)出现负数时报错。

  • period月份越界的表现。

    MySQL在5.7版本中,若月份大于12或等于0,例如200013、199900,会将其顺延到之后的年份,或者将0月作为上一年12月处理。

PERIOD_DIFF()

QUARTER()

-

SEC_TO_TIME()

-

SECOND()

-

STR_TO_DATE()

-

SUBDATE()

-

SUBTIME()

-

TIME()

-

TIME_FORMAT()

-

TIME_TO_SEC()

-

TIMEDIFF()

-

TIMESTAMP()

-

TIMESTAMPADD()

-

TIMESTAMPDIFF()

-

TO_DAYS()

-

TO_SECONDS()

在MySQL 5.7版本中,此函数的精度信息有误。

开启精度传递参数下,GaussDB精度信息正常,和MySQL 8.0版本保持一致。

UNIX_TIMESTAMP()

MySQL会根据入参是否存在小数位,决定返回定点型还是整型。当前GaussDB在内层嵌套操作符或函数时,返回的类型与MySQL可能存在不同。当内层节点返回定点、浮点、字符型、时间类型(不包括DATE类型)时,MySQL可能返回整型,GaussDB会返回定点型。

UTC_DATE()

-

WEEK()

-

WEEKDAY()

-

WEEKOFYEAR()

-

YEAR()

-

YEARWEEK()

-