Вообще говоря, RR
должно работать, но - не во всех случаях. Сначала вам придется исправить данные, потому что RR
будет возвращать разные значения:
- в течение многих лет от
00
до 49
, вы получите в этом веке , 20xx
, тогда как 50
до 99
вернет в предыдущем веке , 19xx
Вот пример:
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> select
2 to_date('03-07-52', 'dd-mm-rr') rr1,
3 to_date('03-07-52', 'dd-mm-yy') yy1 ,
4 --
5 to_date('03-07-47', 'dd-mm-rr') rr2,
6 to_date('03-07-47', 'dd-mm-yy') yy2
7 from dual;
RR1 YY1 RR2 YY2
---------- ---------- ---------- ----------
03.07.1952 03.07.2052 03.07.2047 03.07.2047
SQL>
Как видите, маска формата RR
и YY
для года 47
return 2047
.
Что делать? Объединить 19
со всеми годами, например,
SQL> with test (col) as
2 (select '03-07-52' from dual union all
3 select '03-07-47' from dual
4 )
5 select col,
6 to_date(substr(col, 1, 6) || '19' || substr(col, -2), 'dd-mm-rrrr') result
7 ---------------- ---------------
8 -- this is "03-07-" "19" the last 2 digits
9 --
10 from test;
COL RESULT
-------- ----------
03-07-52 03.07.1952
03-07-47 03.07.1947
SQL>
[EDIT]
Если ваш текущий скрипт вставки работает нормально - в чем я сомневаюсь, что касается ошибки код, который вы упомянули в комментарии:
ORA-01858: не числовой символ c был найден там, где ожидалось число c
, что означает, что не все входные данные имеют одинаковый, ожидаемый и правильный формат DD-MON-YY
, поэтому простой способ исправить даты рождения может быть следующим:
вычесть 100 лет из всех дат, год которых превышает 2000
Вот как:
SQL> create table test (birthdate date);
Table created.
SQL> insert into test
2 select to_date('03-07-52', 'dd-mm-rr') from dual union all
3 select to_date('03-07-47', 'dd-mm-rr') from dual;
2 rows created.
SQL> select * from test;
BIRTHDATE
----------
03.07.1952
03.07.2047
SQL> update test set
2 birthdate = add_months(birthdate, -100 * 12)
3 where extract (year from birthdate) > 2000;
1 row updated.
SQL> select * from test;
BIRTHDATE
----------
03.07.1952
03.07.1947
SQL>
Вы можете изменить это, если, конечно, есть кто-то, кто действительно родился в 2000 году или позже.
По ошибке вы получили (ORA -01858), исправление зависит от того, как именно вы вводите эти значения в таблицу.
- , если бы это был SQL* загрузчик, недопустимые значения будут отклонены и сохранены в
.bad
файл, и вы можете исправить их и обработать позже - , если он использует ext В таблицах можно использовать предложение
where
и опускать недопустимые строки; например, используйте regexp_like
. Или лучше всего убедиться, что все входные значения являются действительными датами. Тогда любой вариант, который вы выберете (я упоминал ранее), будет работать без ошибок ORA-xxxxx.