2014-04-16 34 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獲取此數據。在一個側面說明 - 可能是「乾洗」將工作的外套。 –