Вставьте дату рождения только в формате YY на период до 2000 Oracle DB - PullRequest
0 голосов
/ 13 января 2020

У меня есть файл, где я получаю даты рождения и вставляю их в свою базу данных.

формат выглядит следующим образом:

03-JUN-52

Я использую следующий скрипт для вставки даты

update data."PersonBDates" set BIRTHDATE = to_date('13-SEP-47', 'DD-MON-YY'); 

, и я также использовал

update data."PersonBDates" set BIRTHDATE = to_date('13-SEP-47', 'DD-MON-RR'); 

, но когда я проверяю, нашел ли он 2074, а не 1947. Как вставить эту дату в моя oracle база данных?

Ответы [ 3 ]

2 голосов
/ 13 января 2020

Вообще говоря, 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.

0 голосов
/ 13 января 2020

Я бы предложил реализовать решение, в котором 01 не рассматривается как 1901, но 2001 или что-то подобное (я предполагаю, что год рождения не является 1901 для любого человека в вашей системе).

Case when substr(col, -2) < to_char(sysdate,'YY') 
     then to_date(col, 'DD-MON-YY') 
     else to_date(substr(col, 1, 6) || '19' || substr(col, -2), 'dd-mm-rrrr'
End

Ура !!

0 голосов
/ 13 января 2020

Альтернативный способ объединения 19 на все годы, как предложил Littlefoot.

to_date(regexp_replace('13-SEP-47', '([0-9]+$)', '19\1'), 'DD-MON-YYYY')
...