2013-04-21 61 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