通过Oracle SQL中的变量传递时间间隔

通过Oracle SQL中的变量传递时间间隔,sql,oracle,Sql,Oracle,此查询返回基于给定间隔时间10的值 SELECT TO_CHAR((TO_DATE('23:20:20','HH24:MI:SS') - INTERVAL '10' MINUTE), 'HH24:MI:SS') FROM DUAL; 输出: 23:10:20 我希望使用以下代码通过变量传递此分钟间隔: declare test1 varchar(30); begin test1:=18; SELECT TO_CHAR((TO_DATE('23:20:20','HH24:MI:SS') -

此查询返回基于给定间隔时间10的值

SELECT TO_CHAR((TO_DATE('23:20:20','HH24:MI:SS') - INTERVAL '10' MINUTE), 'HH24:MI:SS') 
FROM DUAL;
输出:

23:10:20
我希望使用以下代码通过变量传递此分钟间隔:

declare
test1 varchar(30);
begin
test1:=18;
SELECT TO_CHAR((TO_DATE('23:20:20','HH24:MI:SS') - INTERVAL ||test1|| MINUTE), 'HH24:MI:SS') 
 FROM DUAL;
 end;
但它不工作-错误是

PL/SQL:ORA-00904:“分钟”:无效标识符


请在这方面帮助我。谢谢

您必须使用
-NUMTODSINTERVAL(test1,'MINUTE')

所以你的陈述是正确的

SELECT TO_CHAR((TO_DATE('23:20:20','HH24:MI:SS') - NUMTODSINTERVAL( test1, 'MINUTE' )), 'HH24:MI:SS' )
 FROM DUAL;

不能这样做,因为它必须是字符串文字,而不是变量。但您可以使用:

声明
test1编号;
开始
测试1:=18;
选择TO_CHAR(TO_DATE('23:20:20','HH24:MI:SS'))
-NUMTODSINTERVAL(test1,'MINUTE'),'HH24:MI:SS')
进入
来自双重;
结束;
/
,包括一个非常简单的函数版本。

试试这个:

DECLARE
   l_val      NUMBER;
   l_result   VARCHAR2( 20 );
BEGIN
   l_val := 10;

   SELECT TO_CHAR( ( TO_DATE( '23:20:20', 'HH24:MI:SS' ) - INTERVAL '1' MINUTE * l_val ), 'HH24:MI:SS' ) INTO l_result FROM DUAL;

   DBMS_OUTPUT.put_line( l_result );
END;
输出将为:

23:10:20

非常棒,很好的解决方法,它必须是间隔后的字符串文字。我讨厌这个限制。我们应该能够传递硬编码的值、变量或列名。
DECLARE
   l_val      NUMBER;
   l_result   VARCHAR2( 20 );
BEGIN
   l_val := 10;

   SELECT TO_CHAR( ( TO_DATE( '23:20:20', 'HH24:MI:SS' ) - INTERVAL '1' MINUTE * l_val ), 'HH24:MI:SS' ) INTO l_result FROM DUAL;

   DBMS_OUTPUT.put_line( l_result );
END;