我的Oracle服务器位于GMT时区,但我的应用程序(使用Oracle进行数据存储)的用户可能来自世界各地。目前,如果用户在程序中执行操作然后查看应用程序的审计跟踪,他们将在GMT中查看时间,因此可能会混淆它们。
有没有办法让日期自动从Oracle中获得正确的时间偏移量?
以下是我想要实现的一个例子:
SELECT SYSDATE FROM DUAL
23:00
我还想检索已保存在普通表中的日期。 E.g。
INSERT INTO AUDIT_TABLE(ACTION, ACTION_TIME) VALUES ('Did something', SYSDATE);
答案 0 :(得分:1)
而不是SYSDATE
,请使用CURRENT_DATE
。
SELECT CURRENT_DATE FROM DUAL;
答案 1 :(得分:0)
当您使用时间戳(在PL / SQL中或作为列的数据类型)时,我建议使用数据类型“TIMESTAMP WITH LOCAL TIME ZONE”。此数据类型始终根据客户端时区显示时间。您还可以使用CURRENT_TIMESTAMP或LOCALTIMESTAMP,它使用resp重新构造TIMESTAMP数据类型。没有时区信息。 CURRENT_DATE返回DATE数据类型。
请注意,CURRENT_DATE会根据客户端时区重新开始计时,但是当您保存此值时,时区信息就会丢失。
数据类型摘要:
DATE
:“旧”日期时间数据类型,没有任何时区信息。
TIMESTAMP
:时间戳,没有任何时区信息。
TIMESTAMP WITH TIME ZONE
:时间戳,带有时区信息,即您获得会话的时区,其中值已插入表中。
TIMESTAMP WITH LOCAL TIME ZONE
:时间戳,带有时区信息。时间始终显示转换为本地时区,因此无法显示时区值(例如+02:00)。在将值插入表中时,您不知道会话中设置了哪个时区。
可以玩的东西:
CREATE TABLE myTable (
col_date DATE,
col_timestamp TIMESTAMP,
col_timestamp_tz TIMESTAMP WITH TIME ZONE,
col_timestamp_local TIMESTAMP WITH LOCAL TIME ZONE);
ALTER SESSION SET TIME_ZONE = '-01:00';
INSERT INTO myTable VALUES (CURRENT_DATE, LOCALTIMESTAMP,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
SELECT t.*, SESSIONTIMEZONE, DBTIMEZONE
FROM myTable t;
ALTER SESSION SET TIME_ZONE = '-05:00';
INSERT INTO myTable VALUES (CURRENT_DATE, LOCALTIMESTAMP,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
SELECT t.*, SESSIONTIMEZONE, DBTIMEZONE
FROM myTable t;