我有一个表,其中包含TIMESTAMP(6) WITH TIME ZONE列,以及INTERVAL DAY(4) TO SECOND(0)列。为了清晰起见,让我们假设以下DDL:
CREATE TABLE TEST_TABLE
(
time_col TIMESTAMP(6) WITH TIME ZONE,
interval_col INTERVAL DAY(4) TO SECOND(0)
);
这个表包含一个索引,它使用这两个列:
CREATE INDEX IDX_DELAY ON TEST_TABLE(time_col+interval_col);
当运行此DDL时,Oracle创建索引,但隐式地添加SYS_EXTRACT_UTC函数:
CREATE INDEX IDX_DELAY ON TEST_TABLE(SYS_EXTRACT_UTC(time_col+interval_col));
相同的DDL过去在其他数据库上运行,并且SYS_EXTRACT_UTC函数不存在。我不知道数据库是否从旧的Oracle版本迁移过来,但目前它们都运行在12c(12.1.0.2.0)上。我已经删除了其中一个索引并重新创建了它,这导致Oracle添加了SYS_EXTRACT_UTC函数。
为什么会发生这种情况?在以前的Oracle DB版本中有什么变化吗?此外,在索引中包含这个函数(或缺少它)会产生什么影响?
提前感谢!
无论如何,要创建索引,您必须能够相互比较值(确定它们是否相等,或者确定哪个较大,哪个较小)。为了将时间戳与时区进行比较,必须将它们转换为单个时区;UTC似乎是一个自然的选择。
我不知道Oracle在旧版本中是否实际上在索引中存储带有时区的时间戳,而不首先将它们转换为标准时区;也许是这样,这就是为什么在旧版本中看不到SYS_EXTRACT_UTC
的原因。如果是这样,有人拥有是件好事。的想法使用这个函数,并存储规范化索引中的时间戳。
无论如何,我看不出你有什么理由担心这个。问题是什么?
编辑——谷歌搜索让我看到了乔纳森·刘易斯的这篇文章;他说他从2013年开始写这篇文章,也就是Oracle 12发布的时候。也许这是一个巧合,或者在那个版本中确实发生了一些变化(要么是索引创建/存储的实际方式,要么是Oracle选择显示给我们的)。
)。https://jonathanlewis.wordpress.com/2019/05/29/timestamp-oddity/