我正在尝试创建一个过程,该过程接受'HH:MI:SS'格式的字符串,并返回秒数。
我想从字符串中解析出小时数,分钟数和秒数,并返回传入值的秒数。
过程创建成功,但当我尝试调用它时,我得到一个错误。谁能告诉我如何解决这个问题?
提前感谢所有回答的人。
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;
你不能select
程序SQL语句中的。您可以选择函数。显然,您必须创建一个函数,而不是一个过程——一个返回整数的函数。
这可能看起来像这样。这仍然可以改进,但我认为这是为了练习/学习的目的。(例如,不清楚为什么需要在代码中使用双引号。)我只做了最小的所需的更改使其工作。我会让你找出这和你的尝试的不同之处。
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
对于正则表达式不要这样做。使用Oracle内置的日期转换函数
SELECT TO_CHAR( TO_DATE('12:34:56','HH24:MI:SS'), 'sssss') FROM dual;
下面是一些带有示例的链接:
- https://nimishgarg.blogspot.com/2014/10/oracle-convert-time-hhmiss-to-seconds.html
- https://www.complexsql.com/how-to-convert-time-to-seconds-in-oracle-with-examples/
- https://www.oracletutorial.com/oracle-date-functions/
最后,如果你告诉我们"我得到一个错误"然后你需要告诉我们误差是什么。总是总是总是切& &;粘贴你得到的准确的错误。实际的错误信息是调试问题最重要的工具。