2011-08-09 90 views
6

我将所有日期作为varchar2(10)插入到表中,并格式化为'mm/dd/yyyy'。我需要的是以下格式'mm-dd-yyyy'和日期数据类型。 没有PLSQL我的实现将是:
Oracle to_date,从mm/dd/yyyy到dd-mm-yyyy

select day||'-'||month||'-'||year as formatted_date from 
(select 
extract(day from (select to_date('1/21/2000','mm/dd/yyyy') from dual)) as day, 
to_number(extract(month from (select to_date('1/21/2000','mm/dd/yyyy') from dual)),09) as month, 
extract(year from (select to_date('1/21/2000','mm/dd/yyyy') from dual)) as year 
from dual); 


结果是:21-1-2000而不是21-01-2000如预期。
当添加额外的TO_DATE(,)为:

to_date(day||'-'||month||'-'||year,'DD-MM-YYYY') as formatted_date 

它也不会更改日期和月份域海誓山盟。

+0

您可以用'{}'工具栏按钮格式化源代码。它通常看起来更好。 –

+3

您应该将日期保存为日期 –

回答

8

我建议你在转换为字符串时使用TO_CHAR()。为了做到这一点,你需要先建立一个日期。

SELECT TO_CHAR(TO_DATE(DAY||'-'||MONTH||'-'||YEAR, 'dd-mm-yyyy'), 'dd-mm-yyyy') AS FORMATTED_DATE 
FROM 
    (SELECT EXTRACT(DAY FROM 
     (SELECT TO_DATE('1/21/2000', 'mm/dd/yyyy') 
     FROM DUAL 
     )) AS DAY, TO_NUMBER(EXTRACT(MONTH FROM 
     (SELECT TO_DATE('1/21/2000', 'mm/dd/yyyy') FROM DUAL 
     )), 09) AS MONTH, EXTRACT(YEAR FROM 
     (SELECT TO_DATE('1/21/2000', 'mm/dd/yyyy') FROM DUAL 
     )) AS YEAR 
    FROM DUAL 
    ); 
14

你不需要搞糟提取部分日期。只需使用to_date及其存储的格式将其转换为日期,然后将该日期转换为所需格式的字符。像这样:

select to_char(to_date('1/10/2011','mm/dd/yyyy'),'mm-dd-yyyy') from dual 
0
select to_char(to_date('1/21/2000','mm/dd/yyyy'),'dd-mm-yyyy') from dual 
+0

您的建议与上面的StevieG相同。 –