Oracle SQL中时区的时间戳

Oracle SQL中时区的时间戳,oracle,plsql,Oracle,Plsql,尝试将时间戳值转换为作为参数(变量)给定的时区时,我遇到了一个奇怪的错误 以下代码引发ORA-00907异常: ORA-00907:缺少右括号 同时,带字符串文字的SQL(第一行注释)和带变量的PL/SQL(第二行注释)都可以正常工作 SQL中的变量可能有什么问题?为什么ORA-00907?您只需要将v_时区变量括在大括号()内,请参见下面的代码 declare tz timestamp := current_timestamp; v_timezone varchar2(100) :=

尝试将
时间戳
值转换为作为参数(变量)给定的时区时,我遇到了一个奇怪的错误

以下代码引发ORA-00907异常:

ORA-00907:缺少右括号

同时,带字符串文字的SQL(第一行注释)和带变量的PL/SQL(第二行注释)都可以正常工作


SQL中的变量可能有什么问题?为什么
ORA-00907

您只需要将v_时区变量括在大括号()内,请参见下面的代码

declare
  tz timestamp := current_timestamp;
  v_timezone varchar2(100) := '03:00';
  tz2 timestamp;
begin
  -- select (tz at time zone '03:00') into tz2 from dual;
  -- either use it as 
  -- select tz at time zone (v_timezone)
  -- or
  -- select (tz at time zone (v_timezone) )
  select (tz at time zone (v_timezone) )
    into tz2
    from dual;
  dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
--  dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;

您只需将v_timezone变量括在大括号()内,请参见下面的代码

declare
  tz timestamp := current_timestamp;
  v_timezone varchar2(100) := '03:00';
  tz2 timestamp;
begin
  -- select (tz at time zone '03:00') into tz2 from dual;
  -- either use it as 
  -- select tz at time zone (v_timezone)
  -- or
  -- select (tz at time zone (v_timezone) )
  select (tz at time zone (v_timezone) )
    into tz2
    from dual;
  dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
--  dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;
需要文字或表达式:

它不像一个变量。似乎变量被隐式地视为
dbms\u输出
调用或任何PL/SQL上下文中的表达式(正如Wernfried指出的,只是
tz2:=tz在时区v\u时区
工作),这有点奇怪;但同样的事情在SQL上下文中不会发生

您可以通过将变量括在括号中,强制将其放入表达式中,或调用一个伪函数:

declare
  tz timestamp := current_timestamp;
  v_timezone varchar2(100) := '03:00';
  tz2 timestamp;
begin
--  select (tz at time zone '03:00') into tz2 from dual;
  select tz at time zone (v_timezone) 
    into tz2
    from dual;
  dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
--  dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;

PL/SQL procedure successfully completed.

17:45:41
从本质上讲,删除现有的多余括号,并在变量周围使用伪括号。您可以改用函数,如
上限(v_时区)
,但这不是必需的-只需使用括号即可将其作为表达式进行计算。奇怪,但工作。。。bug 6113282中提到了它,从9i开始,它似乎就是这样工作的。

需要一个文本或表达式:

它不像一个变量。似乎变量被隐式地视为
dbms\u输出
调用或任何PL/SQL上下文中的表达式(正如Wernfried指出的,只是
tz2:=tz在时区v\u时区
工作),这有点奇怪;但同样的事情在SQL上下文中不会发生

您可以通过将变量括在括号中,强制将其放入表达式中,或调用一个伪函数:

declare
  tz timestamp := current_timestamp;
  v_timezone varchar2(100) := '03:00';
  tz2 timestamp;
begin
--  select (tz at time zone '03:00') into tz2 from dual;
  select tz at time zone (v_timezone) 
    into tz2
    from dual;
  dbms_output.put_line(to_char(tz2,'hh24:mi:ss'));
--  dbms_output.put_line(to_char((tz at time zone v_timezone),'hh24:mi:ss'));
end;

PL/SQL procedure successfully completed.

17:45:41

从本质上讲,删除现有的多余括号,并在变量周围使用伪括号。您可以改用函数,如
上限(v_时区)
,但这不是必需的-只需使用括号即可将其作为表达式进行计算。奇怪,但工作。。。它在bug 6113282中提到过,从9i开始似乎就是这样工作的。

更短的
tz2:=tz在时区v_时区甚至更短
tz2:=tz在时区v_时区