2014-04-16 32 views
1

我使用Oracle开发人员和Oracle 11g(Oracle数据库11g企业版发布11.2.0.3.0 - 生产)如何从SQLPLUS获取时区?

select SESSIONTIMEZONE from DUAL; 

结果在sqlplus/system_config_tbl_load.sql:-4:00
在SQL Developer中结果:America/New_York

在SQL Developer和SQLPLUS中给出了不同的结果。
我想在SQLPLUS中查看该区域。

此外,我要为多个位置做到这一点,并没有使用“ALTER SESSION SET TIME_ZONE =‘美国/纽约’”

回答

0

我假设SQL Developer使得一个内隐更改时区的选项ALTER SESSION SET time_zone=...时你打开一个新的连接。

我看到几个解决方案:

  • 定义客户端主机上的环境变量TZ
  • 创建一个数据库触发器,并相应设置时区
  • 更改数据库的时区 - 工作,除非所有用户设置自己的个人时区

数据库触发器:

CREATE OR REPLACE TRIGGER LOG_T_LOGON 
    AFTER LOGON ON DATABASE 
DECLARE 

BEGIN 
    IF ora_login_user IS NULL THEN 
     RETURN; 
    END IF; 
    IF ora_login_user IN (...) THEN -- Prevent to be executed for EACH user 
     execute immediate 'ALTER SESSION SET time_zone = ''America/New_York'''; 
    END IF; 
END; 

END;

+0

我很抱歉,但是这并不为我工作。由于这需要在多个位置运行,我无法为每个位置编写不同的功能。 –

0

你可以在你的应用程序或在该触发器这样写一个函数:

IF SESSIONTIMEZONE = '-4:00' THEN 
    execute immediate 'ALTER SESSION SET time_zone = ''America/New_York'''; 
ELSIF SESSIONTIMEZONE = '-5:00' THEN 
    execute immediate ... 
END IF; 
+0

这不起作用,因为有多个区域与偏移相关联(即-4:00,-5:00)。另外下面的语句可以用于这个:SELECT distinct tzname,tz_offset(tzname)FROM V $ TIMEZONE_NAMES order by tzname; –

+0

然后它变得越来越困难,你想设置时区(例如)'America/New_York',但你不想/可以将其设置在客户端位置。在德国,我们对此说:“洗我的大衣,但不要让我湿。” - 这是矛盾的。 –

+0

如果没有直接来自Oracle的方式,我最终可能会编写Java存储过程以从OS获取此数据。在一个侧面说明 - 可能是“干洗”将工作的外套。 –