Oracle 如何从SQLPLUS获取时区区域?
我使用的是Oracle Developer和Oracle 11g(Oracle数据库11g企业版11.2.0.3.0-生产版) 导致SQLPLUS/system\u config\u tbl\u load.sql:-4:00Oracle 如何从SQLPLUS获取时区区域?,oracle,oracle11g,sqlplus,Oracle,Oracle11g,Sqlplus,我使用的是Oracle Developer和Oracle 11g(Oracle数据库11g企业版11.2.0.3.0-生产版) 导致SQLPLUS/system\u config\u tbl\u load.sql:-4:00 结果SQL开发者:美国/纽约 在SQL Developer和SQLPLUS中给出不同的结果。 我想看看SQLPLUS中的区域 此外,我必须对多个位置执行此操作,并且不能选择使用“ALTER SESSION SET Time_Zone='America/New_York'”更
结果SQL开发者:美国/纽约 在SQL Developer和SQLPLUS中给出不同的结果。
我想看看SQLPLUS中的区域
此外,我必须对多个位置执行此操作,并且不能选择使用“ALTER SESSION SET Time_Zone='America/New_York'”更改时区。我假设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;
结束 您可以在应用程序或触发器中编写函数,如下所示:
IF SESSIONTIMEZONE = '-4:00' THEN
execute immediate 'ALTER SESSION SET time_zone = ''America/New_York''';
ELSIF SESSIONTIMEZONE = '-5:00' THEN
execute immediate ...
END IF;
对不起,这对我不起作用。因为这需要在多个位置运行,我不能为每个位置编写不同的函数。这也不起作用,因为有多个区域与偏移相关(即-4:00,-5:00)。此外,以下语句也可用于此操作:按tzname的顺序从V$TIMEZONE_NAMES中选择不同的tzname、TZU偏移量(tzname);然后它变得越来越困难,您想将时区设置为(例如)“America/New_York”,但您不想/可以将其设置为客户端位置。在德语中,我们这样说:“洗我的外套,但不要弄湿我。”-这是矛盾的。如果没有直接从Oracle获取数据的方法,我可能会编写一个Java存储过程来从操作系统获取这些数据。另一方面,可能是“干洗”对涂层有效。
IF SESSIONTIMEZONE = '-4:00' THEN
execute immediate 'ALTER SESSION SET time_zone = ''America/New_York''';
ELSIF SESSIONTIMEZONE = '-5:00' THEN
execute immediate ...
END IF;