在正确的时区自动从Oracle获取所有日期

时间:2013-12-06 11:34:21

标签: sql oracle datetime

我的Oracle服务器位于GMT时区,但我的应用程序(使用Oracle进行数据存储)的用户可能来自世界各地。目前,如果用户在程序中执行操作然后查看应用程序的审计跟踪,他们将在GMT中查看时间,因此可能会混淆它们。

有没有办法让日期自动从Oracle中获得正确的时间偏移量?

以下是我想要实现的一个例子:

  • 时间是甲骨文服务器上的13:00 GMT + 00:00
  • 用户登录,其时区为GMT + 10:00
  • 用户执行以下查询SELECT SYSDATE FROM DUAL
  • 用户获得以下输出:23:00

我还想检索已保存在普通表中的日期。 E.g。

  • 时间是格林尼治标准时间13:00 + 00:00
  • 用户登录及其时区为GMT + 10:00
  • 使用一些可审核的操作,使用以下查询保存:INSERT INTO AUDIT_TABLE(ACTION, ACTION_TIME) VALUES ('Did something', SYSDATE);
  • 用户查看审核跟踪以及操作的日期/时间是在当地时间,例如23:00

2 个答案:

答案 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;