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

use*_*073 4 sql oracle

此查询根据给定的间隔时间10返回值.

SELECT TO_CHAR((TO_DATE('23:20:20','HH24:MI:SS') - INTERVAL '10' MINUTE), 'HH24:MI:SS') 
FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

输出:

23:10:20
Run Code Online (Sandbox Code Playgroud)

我想使用下面的代码通过变量传递这个分钟间隔:

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;
Run Code Online (Sandbox Code Playgroud)

但它不起作用 - 错误是

PL/SQL:ORA-00904:"MINUTE":标识符无效

请帮助我.谢谢!

Jen*_*ens 7

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

所以你的说法是。

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


Ale*_*ole 6

你不能这样做,因为它必须是一个字符串文字,而不是一个变量.但您可以使用numtodsinterval()功能:

declare
  test1 number;
begin
  test1:=18;
  SELECT TO_CHAR(TO_DATE('23:20:20','HH24:MI:SS')
   - NUMTODSINTERVAL(test1, 'MINUTE'), 'HH24:MI:SS')
  INTO <something>
  FROM DUAL;
end;
/
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle,包括一个非常简单的函数版本.


Pra*_*hah 5

尝试这个:

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;
Run Code Online (Sandbox Code Playgroud)

输出将是:
23 : 10 : 20