以下为 GaussDB数据库 M-Compatibility兼容性日期时间函数公共说明,与MySQL行为一致。
- 函数入参为时间类型表达式的情况:
时间类型表达式主要包括TEXT、DATETIME、DATE或TIME,但所有可以隐式转换为时间表达式的类型都可以作为入参,比如数字类型可以通过先隐式转化为TEXT,再作为时间类型表达式生效。
但是,不同函数的具体生效情况会有所不同。例如:DATEDIFF函数仅计算日期之间的差值,因此时间表达式会被解析为日期;而TIMESTAMPDIFF函数在计算时间差值时,会根据UNIT参数来决定将时间表达式解析为DATE、TIME或 DATETIME。
- 函数入参为无效日期的情况:
一般而言,日期时间函数支持DATE、DATETIME的范围和MySQL保持一致。DATE支持的范围为'0000-01-01'到'9999-12-31',DATETIME支持的范围为'0000-01-01 00:00:00'到'9999-12-31 23:59:59'。虽然 GaussDB 支持的DATE、DATETIME范围大于MySQL,但是越界仍然算无效日期。
大部分时间函数对于入参为无效时间时,会告警并返回NULL,只有能通过cast正常转换的日期,才是正常合理的日期。
GaussDB M-Compatibility兼容性框架下的大部分日期时间函数与MySQL一致,一些函数的差异如下表所示:
表1 日期与和时间函数列表
MySQL数据库 |
GaussDB数据库 |
差异 |
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 |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕(例:SELECT CURRENT_TIMESTAMP(257) == SELECT CURRENT_TIMESTAMP(1))。
GaussDB只支持[0,6]合法值,其他值报错。 |
CURTIME() |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕(例:SELECT CURTIME(257) == SELECT CURTIME(1))。
GaussDB只支持[0,6]合法值,其他值报错。 |
DATE() |
支持 |
- |
DATE_ADD() |
支持 |
- |
DATE_FORMAT() |
支持 |
- |
DATE_SUB() |
支持 |
- |
DATEDIFF() |
支持 |
- |
DAY() |
支持 |
- |
DAYNAME() |
支持 |
- |
DAYOFMONTH() |
支持 |
- |
DAYOFWEEK() |
支持 |
- |
DAYOFYEAR() |
支持 |
- |
EXTRACT() |
支持 |
- |
FROM_DAYS() |
支持 |
- |
FROM_UNIXTIME() |
支持 |
- |
GET_FORMAT() |
支持 |
- |
HOUR() |
支持 |
- |
LAST_DAY() |
支持 |
- |
LOCALTIME()/LOCALTIME |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕(例SELECT LOCALTIME(257) == SELECT LOCALTIME(1))。
GaussDB只支持[0,6]合法值,其他值报错。 |
LOCALTIMESTAMP/LOCALTIMESTAMP() |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕(例SELECT LOCALTIMESTAMP(257) == SELECT LOCALTIMESTAMP(1))。
GaussDB只支持[0,6]合法值,其他值报错。 |
MAKEDATE() |
支持 |
- |
MAKETIME() |
支持,存在差异 |
分布式下推场景下当TIME类型秒位无精度时,MYSQL默认补齐6个0,GaussDB不做补齐。 |
MICROSECOND() |
支持 |
- |
MINUTE() |
支持 |
- |
MONTH() |
支持 |
- |
MONTHNAME() |
支持 |
- |
NOW() |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕(例SELECT NOW(257)==SELECT NOW(1))。
GaussDB只支持[0,6]合法值,其他值报错。 |
PERIOD_ADD() |
支持,存在差异 |
- 整数溢出处理的行为:
MySQL在5.7版本,此函数入参和结果的最大值都为2^32=4294967296,在入参或结果的period对应的月份累加值以及month_number超过uint32范围时存在整数回绕问题;在MySQL 8.0中已修复此问题。GaussDB下此函数的表现与MySQL 8.0版本保持一致。
- 负数period的表现:
MySQL在5.7版本,会将负数年份解析为异常值而不是报错。GaussDB入参或结果(如100年1月减去10000月)出现负数时报错。在MySQL 8.0中已修复此问题。GaussDB下此函数的表现与MySQL 8.0版本保持一致。
- period月份越界的表现:
MySQL在5.7版本中,若月份大于12或等于0,例如200013、199900,会将其顺延到之后的年份,或者将0月作为上一年12月处理。GaussDB会对越界月份进行报错。在MySQL 8.0中已修复此问题。GaussDB下此函数的表现与MySQL 8.0版本保持一致。
|
PERIOD_DIFF() |
支持,存在差异 |
- 整数溢出处理的行为:
MySQL在5.7版本,此函数入参和结果的最大值都为2^32=4294967296,在入参或结果的period对应的月份累加值以及month_number超过uint32范围时存在整数回绕问题;在MySQL 8.0中已修复此问题。GaussDB下此函数的表现与MySQL 8.0版本保持一致。
- 负数period的表现:
MySQL在5.7版本,会将负数年份解析为异常值而不是报错。GaussDB入参或结果(如100年1月减去10000月)出现负数时报错。在MySQL 8.0中已修复此问题。GaussDB下此函数的表现与MySQL 8.0版本保持一致。
- period月份越界的表现:
MySQL在5.7版本中,若月份大于12或等于0,例如200013、199900,会将其顺延到之后的年份,或者将0月作为上一年12月处理。GaussDB会对越界月份进行报错。在MySQL 8.0中已修复此问题。GaussDB下此函数的表现与MySQL 8.0版本保持一致。
|
QUARTER() |
支持 |
- |
SEC_TO_TIME() |
支持 |
- |
SECOND() |
支持 |
- |
STR_TO_DATE() |
支持,存在差异 |
返回值类型与MySQL有差异,GaussDB返回的是text,MySQL返回的是datetime、date。 |
SUBDATE() |
支持 |
- |
SUBTIME() |
支持 |
- |
SYSDATE() |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕。
GaussDB不回绕。 |
TIME() |
支持 |
- |
TIME_FORMAT() |
支持 |
- |
TIME_TO_SEC() |
支持 |
- |
TIMEDIFF() |
支持 |
- |
TIMESTAMP() |
支持 |
- |
TIMESTAMPADD() |
支持 |
- |
TIMESTAMPDIFF() |
支持 |
- |
TO_DAYS() |
支持 |
- |
TO_SECONDS() |
支持 |
- |
UNIX_TIMESTAMP() |
支持,存在差异 |
MySQL会根据入参是否存在小数位,决定返回定点型还是整型。当前GaussDB在内层嵌套操作符或函数时,返回的类型与MySQL可能存在不同。当内层节点返回定点、浮点、字符型、时间类型(不包括DATE类型)时,MySQL可能返回整型,GaussDB会返回定点型。 |
UTC_DATE() |
支持 |
- |
UTC_TIME() |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕,GaussDB只支持[0,6]合法值,其他值报错。 |
UTC_TIMESTAMP() |
支持,存在差异 |
MySQL入参整型值会按照一字节最大值255整数回绕,GaussDB只支持[0,6]合法值,其他值报错。 |
WEEK() |
支持 |
- |
WEEKDAY() |
支持 |
- |
WEEKOFYEAR() |
支持 |
- |
YEAR() |
支持 |
- |
YEARWEEK() |
支持 |
- |