1

我正在尝试编写一个 plsql 存储过程,它可以识别任何日期格式并将其转换为单个日期时间格式'mm/dd/yyyy hh:mi:ss'。我该怎么做。我尝试使用 case 语句,但日期组合太多,无法为所有日期组合编写 case 语句。例如:27-Oct-1967, October 27 1967 11:15:45,1967-OCT-27等。如何将所有这些转换为单一格式。谢谢你。

4

3 回答 3

1

简单to_char()会做,

select to_char(yourDateField,'mm/dd/yyyy hh:mi:ss') from dual;
于 2013-01-01T11:02:21.687 回答
0

最理想的方法是将日期格式化为您需要的格式。然后做任何你需要的计算。

否则,您将不得不编写大量可笑的select cases 来定义格式。并不是说这没有意义,因为日期可以有多种不同的格式……Mat如前所述。此外,还有Date一个组件可能会受到您的system.

您可以尝试以下方法:

使用给定的日期输入转换为所需的格式To_Date(),您甚至可能不知道此输入是作为字符串还是真实日期。因此,您可能需要进行一些验证以确保它是正确的日期。

SELECT TO_DATE(mydate,'mm/dd/yyyy hh:mi:ss') FROM Dual;
于 2013-01-01T11:20:48.250 回答
0

也许这可以帮助你:

CREATE TABLE temp_date
AS
SELECT '1967-OCT-27' some_date 
FROM dual
UNION
SELECT '27-Oct-1967' FROM dual
UNION
SELECT 'October 27 1967 11:15:45' FROM dual
/

Declare
  CURSOR i_cur IS
  Select some_date 
   From temp_date;
  --
  v_date1 Varchar2(30);
  v_date2 Varchar2(30);
  v_date3 Varchar2(30);
  v_char  Varchar2(30);
  v_cnt   Number:= 0;
Begin
  For i_rec IN i_cur
  Loop
    v_cnt:= v_cnt + 1;
    Begin
      v_date1:= to_char(to_date(i_rec.some_date), 'MM/DD/YYYY hh24:mi:ss');
      dbms_output.put_line(v_cnt||'.'||chr(9)||v_date1);
      EXCEPTION
        When Others Then
          Begin
            v_date2:= to_char(to_date(i_rec.some_date, 'MM/DD/YYYY hh24:mi:ss'), 'MM/DD/YYYY hh24:mi:ss');
            dbms_output.put_line(v_cnt||'.'||chr(9)||v_date2);
            EXCEPTION
              When Others Then 
                Begin
                 v_date3:= to_char(to_date(i_rec.some_date, 'YYYY-MON-DD'), 'MM/DD/YYYY hh24:mi:ss');
                 dbms_output.put_line(v_cnt||'.'||chr(9)||v_date3);
                 EXCEPTION
                   When Others Then 
                   -- Insert into Exceptions table (or any temp table) then convert... --
                    v_char:= i_rec.some_date;
                    dbms_output.put_line(v_cnt||'. '||chr(9)||i_rec.some_date||' : '||v_char);
                End;
          End;
    End;
  End Loop;
End;
/

1.  10/27/1967 00:00:00
2.  10/27/1967 00:00:00
3.  10/27/1967 11:15:45
于 2013-01-02T15:27:48.877 回答