2013-04-21 51 views
0
日期的日子

我需要轉換以下日期,但我得到的錯誤:的Oracle SQL不能字符串日期轉換爲

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

和SQL:

SELECT TO_CHAR(TO_DATE('December 25th, 2004', 'MONTH DD, YYYY'), 'DD-MM-YY') FROM dual; 

我想我得到錯誤,因爲字符串一天格式的:

如果我刪除從它的工作字符串的「日」,但我需要與轉換。

回答

1

如果將其用雙引號括起來,則可以將任意文字添加到您的格式掩碼中。

SQL> ed 
Wrote file afiedt.buf 

    1 SELECT TO_CHAR(TO_DATE('December 25th, 2004', 'MONTH DD"th", YYYY'), 
    2     'DD-MM-YY') 
    3* FROM dual 
SQL>/

TO_CHAR(
-------- 
25-12-04 

當然,這只是工作,如果字符串總是包含文字字符串th。如果您有其他後綴(即December 1st, 2004)其他字符串,你會得到一個錯誤

SQL> ed 
Wrote file afiedt.buf 

    1 SELECT TO_CHAR(TO_DATE('December 1st, 2004', 'MONTH DD"th", YYYY'), 
    2     'DD-MM-YY') 
    3* FROM dual 
SQL>/
SELECT TO_CHAR(TO_DATE('December 1st, 2004', 'MONTH DD"th", YYYY'), 
         * 
ERROR at line 1: 
ORA-01861: literal does not match format string 

如果要同時處理,你可能需要解析原始字符串刪除後綴轉換字符串之前一個日期,然後返回不同的字符串

SQL> ed 
Wrote file afiedt.buf 

    1 WITH x AS (
    2 SELECT 'December 1st, 2004' str FROM dual UNION ALL 
    3 SELECT 'December 25th, 2004' FROM dual 
    4 ) 
    5 SELECT TO_CHAR(
    6   TO_DATE(SUBSTR(str, 1, INSTR(str, ',') - 3) || 
    7      SUBSTR(str, INSTR(str, ',')), 
    8     'MONTH DD, YYYY'), 
    9   'DD-MM-YY') 
10* FROM x 
SQL>/

TO_CHAR(
-------- 
01-12-04 
25-12-04 
+0

的SUBSTR是這樣做當然 – 2013-04-21 13:02:40

1

它的工作沒有thst等,即:

SELECT TO_CHAR(TO_DATE(
     REGEXP_REPLACE('December 25th, 2004', 
         '([[:digit:]]{1,2})(st|nd|rd|th)', '\1'), 
         'MONTH DD, YYYY'), 'DD-MM-YY') 
    FROM dual; 

因此,此表達式將刪除與st,nd,rdth連接的任何一個或兩個數字組合,並計算它的日期。

希望這有助於...乾杯!

+0

的一個非常乾淨的方式,這僅適用於如果使用的唯一後綴爲「日」。如果字符串中包含「1st」和「2nd」之類的內容,則會出現錯誤。而且你不能簡單地替換所有可能的前綴,因爲月份也可以包含這些後綴(即「August」包含「st」)。 – 2013-04-21 12:53:57

+0

是的,我知道,我的第一個表達式被認爲是一個樣本/想法而不是一個完整的解決方案。不幸的是,ORACLE提供了'DDTH'模式,它不適用'VARCHAR2'到'DATE'轉換。因此,替換後綴似乎是唯一的解決方案。 – Trinimon 2013-04-21 18:18:59

3

採取一切這樣的結局小心使用更換4次:

with q as (
     select 'December 25th, 2004' dt from dual 
     union 
     select 'August 1st, 2004' dt from dual 
     union 
     select 'December 2nd, 2004' dt from dual 
     union 
     select 'December 3rd, 2004' dt from dual 
     ) 
select to_char(to_date(replace(replace(replace(replace(dt, 
            'th,', ''), 
            'st,', ''), 
            'nd,',''), 
            'rd,',''), 
            'MONTH DD YYYY'), 'DD-MM-YY') from q 
+0

它的工作原理是尋找「st」,而不僅僅是「st」 – 2013-04-21 12:54:36

+0

如果這些答案中的任何一個都適合,請標記爲正確。我可以使用幾個點:) – 2013-04-22 04:05:56

+0

-1,cos替換'st'會將「August」變成「Augu」 – 2013-04-22 06:34:34