以下为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兼容性框架下GaussDB的大部分日期时间函数与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() | 支持 | - |