0

我需要转换以下日期,但出现错误:

ORA-01841: (完整)年份必须介于 -4713 和 +9999 之间,而不是 0

和 SQL:

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

我认为由于字符串日期格式而出现错误:25th

如果我从字符串中删除 'th' 它正在工作,但我需要用它进行转换。

4

3 回答 3

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
于 2013-04-21T12:46:53.990 回答
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

当然,这只适用于字符串始终包含文字 string 的情况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
于 2013-04-21T12:31:46.327 回答
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

希望这会有所帮助......干杯!

于 2013-04-21T12:31:57.020 回答