繁体   English   中英

Oracle SQL无法将字符串日期转换为日期日期

[英]Oracle SQL can not convert string date to date day

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

ORA-01841 :(完整)年份必须在-4713和+9999之间,并且不能为0

和SQL:

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

我认为由于字符串日期格式,我得到了错误: 25

如果我从字符串中删除了“ th”,那么它将起作用,但是我需要对其进行转换。

要照顾所有此类结局,请替换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

如果将其用双引号引起来,则可以在格式掩码中添加任意文字。

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

它可以不带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;

因此,此表达式删除与stndrdth串联的任何一个或两位数字组合,并从中计算日期。

希望这可以帮助...干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM