【问题标题】:Pass time interval via variable in Oracle SQL通过 Oracle SQL 中的变量传递时间间隔
【发布时间】:2014-07-22 09:05:22
【问题描述】:

此查询根据给定的间隔时间 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": 无效标识符

请在这方面帮助我。谢谢!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您不能这样做,因为它必须是字符串文字,而不是变量。但你可以改用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,包括一个非常简单的函数版本。

    【讨论】:

      【解决方案2】:

      试试这个:

      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

      【讨论】:

      • 真棒,一个很好的解决方法,它必须是 INTERVAL 之后的字符串文字。讨厌这个限制。我们应该能够传递硬编码的值、变量或列名。
      【解决方案3】:

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

      所以你的说法是。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        相关资源
        最近更新 更多