【问题标题】:Oracle SQL can not convert string date to date dayOracle SQL 无法将字符串日期转换为日期日期
【发布时间】:2013-04-21 12:20:00
【问题描述】:

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

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

还有 SQL:

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

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

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

【问题讨论】:

    标签: sql oracle date format


    【解决方案1】:

    要处理所有此类结尾,请使用替换 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
    

    【讨论】:

    • 如果这些答案中的任何一个是合适的,请标记为正确。我可以使用几点:)
    • 啊,是的,确实如此。您能否对编辑进行无意义的更改,以便我取消对您的投票?
    • 我将答案更改为包括“2004 年 8 月 1 日”,以帮助解决混淆 :)
    【解决方案2】:

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

    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
    

    【讨论】:

    • substr 是一种非常干净的方法
    【解决方案3】:

    没有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 连接的任何一位或两位数字组合,并从中计算日期。

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

    【讨论】:

    • 当然,这只有在使用的唯一后缀是“th”时才有效。如果字符串中有“1st”和“2nd”之类的东西,你会得到一个错误。而且您不能简单地替换所有可能的前缀,因为月份也可以包含这些后缀(即“August”包含“st”)。
    • 是的,我知道,我的第一个表达被认为是一个示例/想法,而不是一个完整的解决方案。不幸的是,ORACLE 提供了一个DDTH 模式,它不适用于VARCHAR2DATE 的转换。所以更换后缀似乎是唯一的解决办法。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2011-11-28
    • 2017-06-16
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多