codecamp

OceanBase 日期时间 DATE 和间隔 INTERVAL 的计算

您可以在日期(DATE)、时间戳(TIMESTAMPTIMESTAMP WITH TIME ZONE 和 TIMESTAMP WITH LOCAL TIME ZONE)和间隔(INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND)上执行许多算术运算。

OceanBase 根据以下规则计算结果:

  • 您可以在日期和时间戳值(而非间隔值)的算术运算中使用​ NUMBER ​常数。OceanBase 在内部将时间戳值转换为日期值,并将算术日期时间和间隔表达式中的 ​NUMBER​ 常量解释为天数。例如,​SYSDATE​ +1 是明天。​SYSDATE​-7 是一周前。​SYSDATE​ +(10/1440)是十分钟之后。

  • 注意 您不能乘以或除以日期或时间戳值。

  • OceanBase 将 ​BINARY_FLOAT​ 和 ​BINARY_DOUBLE​ 操作数转换为 ​NUMBER​。

  • 每个 ​DATE​ 值都包含一个时间成分,许多日期运算的结果都包含一个分数。此分数表示一天的一部分。例如,1.5 天是 36 个小时。OceanBase 内置函数还返回这些分数,以对 ​DATE​ 数据执行常见操作。例如,​MONTHS_BETWEEN​ 函数返回两个日期之间的月数。结果的小数部分代表一个 31 天月份的那部分。

  • 如果一个操作数是 ​DATE​ 值或数字值,但都不包含时区或小数秒部分,则:

    • OceanBase 将其他操作数转换为 DATE 数据。数值乘以间隔例外,这将返回一个间隔。

    • 如果另一个操作数具有时区值,则 OceanBase 在返回的值中使用当前会话时区。

    • 如果另一个操作数具有小数秒数值,则小数秒数值将丢失。

  • 当您将时间戳,时间间隔或数字值传递给仅限于 DATE 数据类型使用的内置函数时,OceanBase 将把非 DATE 值转换为 DATE 值。

  • 当间隔计算返回日期时间值时,结果必须是实际的日期时间值,否则数据库将返回错误。例如,以下两个语句返回错误:

SELECT TO_DATE("31-AUG-2004','DD-MON-YYYY") + TO_YMINTERVAL("0-1") FROM DUAL;
SELECT TO_DATE("29-FEB-2004','DD-MON-YYYY") + TO_YMINTERVAL("1-0") FROM DUAL;

第一条语句失败,因为在一个有31天的月份上增加一个月,导致计算结果为 9 月 31 日,这不是有效的日期。第二条语句失败,因为在仅每四年存在的日期上增加一年是无效的。但是,在 2 月 29 日之前加上四年是有效的,计算结果为2008年2月29日:

SELECT TO_DATE("29-FEB-2004", "DD-MON-YYYY") + TO_YMINTERVAL("4-0") FROM DUAL;
  • 下表是日期时间算术运算的矩阵。“—”表示不支持的操作。

OceanBase 日期时间 DATE 和间隔 INTERVAL 的计算

OceanBase INTERVAL DAY TO SECOND 数据类型
OceanBase RAW数据类型
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

OceanBase 控制台指南

OceanBase ODC 使用指南

OceanBase Web 版 ODC

OceanBase 客户端版 ODC

OceanBase Connector/J 开发者指南

OceanBase 什么是OceanBase Connector/J

OceanBase SQL 参考(MySQL 模式)

OceanBase SQL 参考(Oracle 模式)

OceanBase 基本元素

OceanBase 数据库对象

OceanBase 函数

OceanBase 单行函数

OceanBase 返回数字的字符串函数

OceanBase 通用比较函数

OceanBase 编码解码函数

OceanBase SQL 调优指南

OceanBase 相关协议

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }