OceanBase 数据库当前版本所支持的日期时间相关的数据类型包括 DATE、TIME、DATETIME、TIMESTAMP 和 YEAR,每个类型的值拥有一个合法范围。
使用日期时间类型时,需要考虑以下几点:
OceanBase 数据库以标准的格式输出日期时间类型,但是会尝试以多种格式解析用户输入的值。
尽管 OceanBase 数据库尝试以多种格式解析用户输入的字面量,日期部分必须符合"年-月-日"的顺序,例如 '98-09-04',不能是"月-日-年"或者"日-月-年"的顺序,例如 '09-04-98' 和 '04-09-98'。如果希望转换不满足"年-月-日"顺序的字符串,可以使用 STR_TO_DAT 函数。
如果输入的年份是两位数是具有歧义的,因为不确定是哪个世纪。OceanBase 数据库转换一位或两位年份的原则是,"70-99"之间的年份转换为"1970-1999","00-69"之间的年份转换为"2000-2069"。
当发生日期时间类型之间的转换时,如果源类型是
DATE类型而目的类型是DATETIME或TIMESTAMP类型,那么转换后时间部分为 '00:00:00',如果源类型是TIME类型而目的类型是DATETIME或TIMESTAMP类型,那么转换后日期部分为系统当前日期,该日期受系统变量timestamp的影响。如果在数值场景中使用日期时间相关类型,例如用作加法的参数,OceanBase 数据库会将其转换数值类型,反之亦然。
通常情况下,当一个值超出日期或时间类型的合法范围或者是无效的值时,OceanBase 数据库会将其转换为该类型的零值。例如对于
DATETIME类型,转换结果为 '0000-00-00 00:00:00',对于DATE类型,转换结果为 '0000-00-00'。一个例外是超出范围的TIME值会被转换为TIME类型合法范围的边界值。设置 SQL Mode 可以控制 OceanBase 数据库支持哪些日期值。例如在 SQL Mode 中添加
ALLOW_INVALID_DATES可以使数据库接受 '2009-11-31' 这样的日期值,此时数据库只会检查月是否出于 1~12 之间,日是否出于 1~31 之间。从 SQL Mode 中删去NO_ZERO_IN_DATE,可以使数据库接受 '2020-00-01' 和 '2020-01-00'这样的日期值,此时使用 DATE_SUB 和 DATE_ADD 等函数可能无法得到正确的结果。OceanBase 数据库允许日期部分为 '0000-00-00',如果类型是
DATETIME或TIMESTAMP,那么时分秒部分必须同样为 0。
下面的表格展示了日期时间相关的每个类型的零值。用户可以显式使用表格中的值表示零值,也可以使用 0 或 '0',后者更加方便。
| 类型 | 零值格式 |
|---|---|
| DATE | '0000-00-00' |
| TIME | '00:00:00' |
| DATETIME | '0000-00-00 00:00:00' |
| TIMESTAMP | '0000-00-00 00:00:00' |
| YEAR | 0000 |




