暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

OceanBase系统架构日期时间数据类型

2023-12-04
1669

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'
YEAR0000
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论