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

时间:2014-07-22 09:05:22

标签: 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') - INTERVAL ||test1|| MINUTE), 'HH24:MI:SS') 
 FROM DUAL;
 end;

但它不起作用 - 错误是

  

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

请帮助我。谢谢!

3 个答案:

答案 0 :(得分:6)

你不能这样做,因为它必须是字符串文字,而不是变量。但您可以改为使用the numtodsinterval() function

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;
/

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

答案 1 :(得分:4)

试试这个:

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点十分20秒

答案 2 :(得分:1)

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

所以你的陈述是。

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