Oracle 如何从SQLPLUS获取时区区域?

Oracle 如何从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'”更

我使用的是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 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;