Oracle current_timestamp 在同一会话中提供不同的值

问题描述 投票:0回答:1

我们有一个表定义为:

CREATE TABLE tokens (
  token VARCHAR2(36) NOT NULL PRIMARY KEY,
  username VARCHAR2(60) NOT NULL,
  insertedOn TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

如果我们使用 SQL Developer 连接到数据库,我们将得到以下内容:

SELECT CURRENT_TIMESTAMP FROM DUAL
-- 25-AGO-23 17:15:01,515019000 EUROPE/BERLIN

SELECT SESSIONTIMEZONE FROM DUAL;
-- EUROPE/BERLIN

但是如果我们在同一会话期间从 SQL Developer 插入一行:

INSERT INTO tokens (token, username) VALUES ('123', 'john');

插入的行带有意外的时间戳(-1 小时):

SELECT * FROM tokens;
-- 123 john 16:15:27,929125000

为什么时间戳插入了不同的值?


数据库为Oracle Database 10g企业版10.2.0.4.0

会话参数如下:

oracle timestamp default-value
1个回答
0
投票

insertedOn TIMESTAMP
定义为不包含时区的
TIMESTAMP
。然而,函数
CURRENT_TIMESTAMP
返回一种不同的数据类型,其中 包含时区 (
TIMESTAMP WITH TIME ZONE
)。为了将此数据类型插入到
TIMESTAMP
列中,Oracle 必须根据您的时区设置进行转换,这就是发生转变的地方。

要修复,请重新定义您的列:

CREATE TABLE tokens (
  token VARCHAR2(36) NOT NULL PRIMARY KEY,
  username VARCHAR2(60) NOT NULL,
  insertedOn TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

顺便说一句,PL/SQL 变量也是如此。每当您将

SYSTIMESTAMP
CURRENT_TIMESTAMP
的结果存储在变量或表列中时,请确保类型为
TIMESTAMP WITH TIME ZONE
,否则它会根据您的时区设置进行转换并可能发生变化,这可能会导致一些问题不想要的结果。

© www.soinside.com 2019 - 2024. All rights reserved.