开发者社区> 问答> 正文

云数据库OceanBase的时间日期类型

日期和时间类型格式范围大小(字节)
DATEYYYY-MM-DD‘1000-01-01’到‘9999-12-31’3
DATETIMEYYYY-MM-DD HH:MM:SS‘1000-01-01 00:00:00’到 ‘9999-12-31 23:59:59’5+秒精度存储(实际存储:8字节)
TIMESTAMPYYYY-MM-DD HH:MM:SS‘1970-01-01 00:00:00’到 ‘2037-12-31 23:59:59’4+秒精度存储(实际存储:8字节
TIMEHH:MM:SS‘-838:59:59’到‘838:59:59’3+秒精度存储(实际存储:6字节)
YEARYYYY(默认格式)‘1901到2155’和‘0000’1
YY‘70到69’,表示从1970年到2069年。

在日期和时间函数中,DATETIME、TIMESTAMP、TIME类型,默认是精确到秒,还支持指定秒精度参数,秒精度存储根据存储需求最大支持微妙(3字节),秒精度存储根据精度不同,占用空间取0-3字节。
形如:type_name(fsp)。
type_name 表示DATETIME、TIMESTAMP、TIME等类型。
fsp参数是表示秒精度,取值范围为:0-6。默认值取0;最大值为6,表示精确到微妙。

  • DATE
    日期。支持的范围为‘1000-01-01’到‘9999-12-31’。以‘YYYY-MM-DD’格式显示DATE值,但允许使用字符串或数字为DATE列分配值。

  • DATETIME
    DATETIME[(fsp)]
    日期和时间的组合。支持的范围是‘1000-01-01 00:00:00.000000’到‘9999-12-31 23:59:59.000000’。以‘YYYY-MM-DD HH:MM:SS[.fraction] ’格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。fsp参数是表示秒精度,取值范围为:0-6。默认值取0;最大值为6,表示精确到微妙。
    DATETIME 数据类型和 TIMESTAMP 数据类型都支持 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 子句。

  • TIMESTAMP
    TIMESTAMP[(fsp)]
    这个数据类型与MySQL不完全一致,主要是在OceanBase 1.0里TIMESTAMP类型的格式是按严格模式来判断,不允许“0000-00-00 00:00:00”等非法值。
    下列字符串类型是不合法的: ‘2012^12^32’
  •   ‘20070523’
  •   ‘070523’
  •   ‘071332’


  • 下列整数类型同样是不合法的:
  • 19830905
  •   830905


  • DEFAULT CURRENT_TIMESTAMP,ON UPDATE CURRENT_TIMESTAMP 子句
    用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列默认使用当前的时间戳,并且自动更新;如果默认值设定为其他值(如0或NULL),则不会自动更新时间戳。

  • TIME
    TIME[(fsp)]
    时间。范围是 ‘-838:59:59.000000’到‘838:59:59.000000’。以‘HH:MM:SS[.fraction]’格式显示TIME值,但允许使用字符串或数字为TIME列分配值。fsp参数是表示秒精度,取值范围为:0-6。默认值取0;最大值为6,表示精确到微妙。
    ‘D HH:MM:SS[.fraction]’格式的字符串。还可以使用下面任何一种“非严格”语法:‘H:MM:SS[.fraction]’、‘HH:MM:SS’、‘HH:MM’、‘D HH:MM:SS’、‘D HH:MM’、‘D HH’或‘SS’。这里D表示日,可以取0到34之间的值。
    ‘HHMMSS’格式的没有间割符的字符串,假定是有意义的时间。例如,‘101112’被理解为‘10:11:12’,但‘109712’是不合法的(它有一个没有意义的分钟部分),将变为‘00:00:00’。
    HHMMSS格式的数值,假定是有意义的时间。例如,101112被理解为‘10:11:12’。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。
    函数返回的结果,其值适合TIME上下文,例如CURRENT_TIME。
    对于指定为包括时间部分间割符的字符串的TIME值,如果时、分或者秒值小于10,则不需要指定两位数。‘8:3:2’与‘08:03:02’相同。
    为TIME列分配简写值时应注意。没有冒号,解释值时假定最右边的两位表示秒。(解释TIME值为过去的时间而不是当天的时间)。例如,你可能认为‘1112’和1112表示‘11:12:00’(11点过12分),系统中将它们解释为‘00:11:12’(11分,12 秒)。同样,‘12’和12 被解释为 ‘00:00:12’。相反,TIME值中使用冒号则肯定被看作当天的时间。也就是说,‘11:12’表示‘11:12:00’,而不是‘00:11:12’。
    超出TIME范围但合法的值被裁为范围最接近的端点。例如,‘-850:00:00’和‘850:00:00’被转换为‘-838:59:59’和‘838:59:59’。
    无效TIME值被转换为‘00:00:00’。请注意由于‘00:00:00’本身是一个合法TIME值,只从表内保存的一个‘00:00:00’值还不能说出原来的值是 ‘00:00:00’还是不合法的值。

  • YEAR
    两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000。在两位格式中,允许的值是70到69,表示从1970年到2069年。以YYYY 格式显示YEAR值,但允许使用字符串或数字为YEAR列分配值。
    可以指定各种格式的YEAR值:
    四位字符串,范围为‘1901’到‘2155’。

  • 四位数字,范围为1901到2155。

  • 两位字符串,范围为‘00’到‘99’。‘00’到‘69’和‘70’到‘99’范围的值被转换为2000到2069和1970到1999范围的YEAR值。

  • 两位整数,范围为1到99。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的YEAR值。请注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为数字并将它解释为2000。你必须将它指定为一个字符串‘0’或‘00’或它被解释为0000。

  • 函数返回的结果,其值适合YEAR上下文,例如NOW()。
    非法YEAR值被转换为0000。

对于DATETIME、DATE、TIMESTAMP和YEAR类型,OceanBase使用以下规则解释含模糊年值的日期:

  • 00-69范围的年值转换为2000-2069。

  • 70-99范围的年值转换为1970-1999。

ORDER BY可以正确排序有两位年的TIMESTAMP或YEAR值。
部分函数如MIN()和MAX()将TIMESTAMP或YEAR转换为一个数字。这说明使用有两位年值的值,这些函数不能工作正确。在这种情况下的修复方法是将TIMESTAMP或YEAR转换为四位年格式或使用MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS))。

展开
收起
云栖大讲堂 2017-11-01 14:27:29 4872 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载