如何使用to_number函数在Oracle中的数字中添加前导零

时间:2017-03-28 04:50:23

标签: sql database oracle11g

  create or replace FUNCTION OT_TIMMING_CHECK 
  (V_OT_ROOM_ID NUMBER,V_OPERATION_DATE DATE,V_START_TIME VARCHAR2,  
   V_END_TIME VARCHAR2)
   RETURN NUMBER AS 

  V_STATUS_1 VARCHAR2(10);
  V_STATUS_2 VARCHAR2(10);
  V_STATUS_3 VARCHAR2(10);
  V_STATUS_4 VARCHAR2(10); 
  V_STATUS_5 VARCHAR2(10);
  V_STATUS_6 VARCHAR2(10);
  C_END_TIME NUMBER;
  C_START_TIME NUMBER;
  F_OPERATION_DATE DATE;
  V_COUNT NUMBER :=0;
  b_start_time varchar(10);

 BEGIN 

 SELECT OPERATION_DATE INTO F_OPERATION_DATE FROM OT_THEATRE_STATUS_TBL1 
   WHERE OPERATION_DATE = V_OPERATION_DATE AND ROWNUM<2 ;

  SELECT (case when (substr(V_START_TIME,1,instr(V_START_TIME,':')-1))='00'
     then 24 
  else to_number(substr(V_START_TIME,1,instr(V_START_TIME,':')-1)) end) INTO       
 C_START_TIME from dual;

 SELECT (case when (substr(V_END_TIME,1,instr(V_END_TIME,':')-1))='00' then       
   24 else to_number(substr(V_END_TIME,1,instr(V_END_TIME,':')-1)) end) INTO     
   C_END_TIME from dual;

 IF V_OT_ROOM_ID=1 AND F_OPERATION_DATE = V_OPERATION_DATE THEN 

 WHILE (C_START_TIME < C_END_TIME)
  LOOP 

 SELECT STATUS_1 INTO V_STATUS_1  FROM OT_THEATRE_STATUS_TBL1
 WHERE START_TIME=concat(to_char(C_START_TIME),':00:00')
 AND END_TIME= REPLACE(concat(to_char(C_START_TIME+1),':00:00'),24,'00');

 IF(V_STATUS_1 ='Booked' OR V_STATUS_1='Pending') then 
 RETURN 1;

 ELSE 
  C_START_TIME:= TO_CHAR(C_START_TIME+1);
  V_COUNT:=V_COUNT+1;
end if;

END LOOP;
RETURN 0;

END IF ;
END;

数据库结构就像这样

 V_START_TIME V_END_TIME OPERATION_Date STATUS_1    OT_ROOM_ID_1  
 01:00:00   01:00:00    24-Mar-17   AVAILABLE   1
 02:00:00   02:00:00    24-Mar-17   LAPSED      1
 03:00:00   03:00:00    24-Mar-17   AVAILABLE   1
 04:00:00   04:00:00    24-Mar-17   AVAILABLE   1
 05:00:00   05:00:00    24-Mar-17   AVAILABLE   1
 06:00:00   06:00:00    24-Mar-17   AVAILABLE   1
 07:00:00   07:00:00    24-Mar-17   AVAILABLE   1
 08:00:00   08:00:00    24-Mar-17   AVAILABLE   1
 09:00:00   09:00:00    24-Mar-17   AVAILABLE   1
 10:00:00   10:00:00    24-Mar-17   AVAILABLE   1
 11:00:00   11:00:00    24-Mar-17   AVAILABLE   1
 12:00:00   12:00:00    24-Mar-17   AVAILABLE   1
 13:00:00   13:00:00    24-Mar-17   BOOKING     1
 14:00:00   14:00:00    24-Mar-17   AVAILABLE   1
 15:00:00   15:00:00    24-Mar-17   AVAILABLE   1
 16:00:00   16:00:00    24-Mar-17   AVAILABLE   1
 17:00:00   17:00:00    24-Mar-17   AVAILABLE   1
 18:00:00   18:00:00    24-Mar-17   AVAILABLE   1
 19:00:00   19:00:00    24-Mar-17   AVAILABLE   1
 20:00:00   20:00:00    24-Mar-17   AVAILABLE   1
 21:00:00   21:00:00    24-Mar-17   AVAILABLE   1
 22:00:00   22:00:00    24-Mar-17   AVAILABLE   1
 23:00:00   23:00:00    24-Mar-17   AVAILABLE   1
 00:00:00   00:00:00    24-Mar-17   AVAILABLE   1

早些时候V_START_TIME喜欢'1:00:00:00',但现在它以0领先。然后出现问题。现在它返回null。如何摆脱这个问题。

2 个答案:

答案 0 :(得分:0)

是的,试试吧

SELECT (
  CASE
    WHEN (SUBSTR('01:00:00',1,instr('01:00:00',':')-1))='00'
    THEN '24'
    ELSE LPAD(SUBSTR('01:00:00',1,instr('01:00:00',':')-1),2,'0')
  END)
FROM dual;

答案 1 :(得分:0)

号码不会有领先的零 你能尝试以下方法:

LPAD(TO_NUMBER(SUBSTR(&#39; 01:00:00&#39;,1,INSTR(&#39; 01:00:00&#39;&#39;:&#39;) - 1)),2,0)

参考: How to display the leading zero's in a number of oracle