HH:MI:SS 字符串到 return 秒数

HH:MI:SS string to return number of seconds

我正在尝试创建一个接受 'HH:MI:SS' 格式字符串和 RETURN 秒数的过程。

我想从字符串中解析出小时数、分钟数和秒数,以及return传入值的秒数。

程序已成功创建,但当我尝试调用它时出现错误。谁能告诉我如何解决这个问题。

提前感谢所有回答者。

CREATE OR REPLACE PROCEDURE CONVERT_TO_SECONDS( 
  i_date_string IN VARCHAR2,
    o_seconds      OUT PLS_INTEGER 
)
AS
 l_hours      NUMBER;
 l_minutes  NUMBER;
 l_seconds  NUMBER;
BEGIN
SELECT trim('"'
  FROM regexp_substr(i_date_string,'".*?"|[^:]+',1,1)) hours,
    trim('"'
  FROM regexp_substr(i_date_string,'".*?"|[^:]+',1,2)) minutes,
    trim('"'
  FROM regexp_substr(i_date_string,'".*?"|[^:]+',1,3)) seconds
      INTO l_hours ,
    l_minutes ,
    l_seconds
  FROM dual ;

o_seconds := 
     l_hours*3600 +  
     l_minutes*60 +
     l_seconds;

END;

SELECT CONVERT_TO_SECONDS('08:08:08') FROM DUAL;

不要对正则表达式执行此操作。使用 Oracle 内置的日期转换函数。

SELECT TO_CHAR( TO_DATE('12:34:56','HH24:MI:SS'), 'sssss') FROM dual;

以下是更多示例链接:

最后,如果您告诉我们“我遇到错误”,那么您需要告诉我们错误是什么。始终始终始终剪切并粘贴您遇到的确切错误。实际的错误信息是调试问题最重要的工具。

您不能在 SQL 语句中 select 过程 。你可以select一个函数。显然你必须创建一个函数,而不是一个过程 - 一个 returns integer.

的函数

这可能是这样的。这仍然可以改进,但我认为这是为了 practice/learning 目的。 (例如,不清楚为什么需要在代码中使用双引号。)我只做了 fewest 所需的更改让它起作用。我会让你找出这和你的尝试之间的区别。

CREATE OR REPLACE FUNCTION CONVERT_TO_SECONDS( 
  i_date_string IN VARCHAR2 
)
RETURN INTEGER            
AS
 l_hours      NUMBER;
 l_minutes  NUMBER;
 l_seconds  NUMBER;
BEGIN
SELECT trim('"'
  FROM regexp_substr(i_date_string,'".*?"|[^:]+',1,1)) hours,
    trim('"'
  FROM regexp_substr(i_date_string,'".*?"|[^:]+',1,2)) minutes,
    trim('"'
  FROM regexp_substr(i_date_string,'".*?"|[^:]+',1,3)) seconds
      INTO l_hours ,
    l_minutes ,
    l_seconds
  FROM dual ;
return
     l_hours*3600 +  
     l_minutes*60 +
     l_seconds;
     
END;
/

Function CONVERT_TO_SECONDS compiled
    
SELECT CONVERT_TO_SECONDS('08:08:08') FROM DUAL;

CONVERT_TO_SECONDS('08:08:08')
------------------------------
                         29288