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

そのようなすべてのエンディングを処理するには、replace を 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

もちろん、これは文字列に常にリテラル文字列が含まれている場合にのみ機能します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

などなしthで機能stします。つまり、次のようになります。

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したがって、この式は、 、ndrdまたはで連結された 1 桁または 2 桁の数字の組み合わせを削除し、thそこから日付を計算します。

これが役に立てば幸いです...乾杯!

于 2013-04-21T12:31:57.020 に答える