Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
Всем добрый день!

Возникла такая задача:
в поле проставлены некорректные даты, типа '18.05.2026'. Нужно заменить две цифры, начиная с 7-ой позиции, на '19'.
Две цифры '20' получаю запросом:
SUBSTR(TO_CHAR(DATE_OF_BIRTH,'DD.MM.YYYY'), 7, 2)


Пробовал заменять апдейтом (тестил для одной записи CLNT_ID = 9356):
UPDATE CONTRACT
SET DATE_OF_BIRTH = REPLACE(SUBSTR(TO_CHAR(DATE_OF_BIRTH,'DD.MM.YYYY'), 7, 2), '19')
WHERE CLNT_ID = 9356

Знаю, что неправильно, просто не могу понять где именно... прошу вашей подсказки.
13 ноя 13, 15:22    [15122121]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Elic
Member

Откуда:
Сообщений: 29976
RTFM ADD_MONTHS (FAQ)
13 ноя 13, 15:25    [15122165]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
dragonglad
Member

Откуда: Москва
Сообщений: 136
Выполнить запрос REPLACE(SUBSTR(TO_CHAR(DATE_OF_BIRTH,'DD.MM.YYYY'), 7, 2), '19') и покурить результаты.
13 ноя 13, 16:29    [15122924]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
Elic
RTFM ADD_MONTHS (FAQ)


Спасибо за наводку! =)

Однако странно... SELECT ADD_MONTHS(SYSDATE,-1200) FROM DUAL выдает мне всё нормально = 13.11.1913 16:42:21

А вот:
UPDATE CONTRACT
SET DATE_OF_BIRTH = 
REPLACE(DATE_OF_BIRTH,ADD_MONTHS(DATE_OF_BIRTH,-1200))
WHERE CLNT_ID = 9356

преобразует поле в NULL. Что не так делаю?..
13 ноя 13, 16:44    [15123070]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Elic
Member

Откуда:
Сообщений: 29976
Alexander Warlord
Что не так делаю?..
Не понимаешь основ: думаешь, что дата - это строка.
13 ноя 13, 16:49    [15123103]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Alexander Warlord
Однако странно... SELECT ADD_MONTHS(SYSDATE,-1200) FROM DUAL выдает мне всё нормально = 13.11.1913 16:42:21

А вот:
UPDATE CONTRACT
SET DATE_OF_BIRTH = 
REPLACE(DATE_OF_BIRTH,ADD_MONTHS(DATE_OF_BIRTH,-1200))
WHERE CLNT_ID = 9356

преобразует поле в NULL. Что не так делаю?..

Ну если ADD_MONTHS выдаёт нужный результат, то зачем его ещё в REPLACE совать?
UPDATE CONTRACT
SET DATE_OF_BIRTH = ADD_MONTHS(DATE_OF_BIRTH,-1200)
WHERE CLNT_ID = 9356
13 ноя 13, 17:10    [15123343]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
Это мне уже голову напекло под конец дня... :)
Всем огромное спасибо!
13 ноя 13, 17:17    [15123435]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
Всем доброго утра!
А всё-таки первоначальный вопрос... - можно ли заменять именно 2 цифры с определённой позиции на нужные другие? или слишком сложный запрос получится?
Просто попадаются и такие варианты для исправления:
31.01.9210
12.02.9098
25.09.8097
05.01.7889
19.02.6095
12.06.4864
14 ноя 13, 09:46    [15125861]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Alexander Warlord
можно ли заменять именно 2 цифры с определённой позиции на нужные другие?

Да пожалуйста, кто мешает то?
Главное помнить, что дата <> строка.
to_date
14 ноя 13, 09:55    [15125897]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
pan159
Member

Откуда: Москва
Сообщений: 811
Есть тонкость.
Если заменить год в дате 29.02.2000 на 29.02.1900, то будет ошибка, т.к. 1900 не високосный год.
14 ноя 13, 10:25    [15126067]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Elic
Member

Откуда:
Сообщений: 29976
pan159
Есть тонкость.
Для тебя тоже дата - это строка?
14 ноя 13, 10:28    [15126085]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
pan159
Member

Откуда: Москва
Сообщений: 811
Elic
pan159
Есть тонкость.
Для тебя тоже дата - это строка?

Отнюдь. Из моего замечания разве не видно, что дата это не строка?
14 ноя 13, 10:46    [15126214]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
pan159,
Совсем необязательно преобразовывать даты простым replace, и не нужно будет вспоминать високосный год или нет. Хотя я тоже не совсем ту ссылку дал, точнее будет:
Datetime Format Models
+
with t as ( select to_date('01.01.1900','dd.mm.yyyy') d from dual
            union all
            select to_date('29.02.2000','dd.mm.yyyy') from dual
            union all
            select to_date('14.11.4096','dd.mm.yyyy') from dual )
select to_char(t.d,'CC'), t.d
  from t
/
SQL> 
 
TO_CHAR(T.D,'CC') D
----------------- -----------
19                01.01.1900
20                29.02.2000
41                14.11.4096
 
SQL> 
14 ноя 13, 11:18    [15126455]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
pan159
Member

Откуда: Москва
Сообщений: 811
ten,
Надо вернуться к вопросу топикстартера.

У него попадаются совсем бредовые даты, год которых надо предварительно исправить. Но потом надо обязательно проверить, а существуют ли такие даты в календаре вообще.

Я думаю, что там вобще речь идет о первичной загрузке строковых данных в таблицу. Ошибки то делают не только в номере года, но и в других частях даты тоже. Так что 32 июня или 15 месяц в году тоже могут иметь место на входе.
14 ноя 13, 11:47    [15126716]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
pan159
Надо вернуться к вопросу топикстартера.... Я думаю...
Может внимательнее читать вопрос автора? 15122121 Где Вы видите строки вместо дат?

pan159
У него попадаются совсем бредовые даты, год которых надо предварительно исправить. Но потом надо обязательно проверить, а существуют ли такие даты в календаре вообще.

Еще раз, для исправления необязательно переводить даты в строки.
15126455
Подсказка: в неверных датах неправильно указано столетие.
14 ноя 13, 12:13    [15126945]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
ten
Подсказка: в неверных датах неправильно указано столетие.

Именно. Причем поле DATE_OF_BIRTH типа DATE.
Мне просто нужно в выбранных записях (с определенными условиями) поменять 2 цифры столетия на другие 2 требуемые цифры.
14 ноя 13, 13:05    [15127482]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Alexander Warlord
Всем доброго утра!
А всё-таки первоначальный вопрос... - можно ли заменять именно 2 цифры с определённой позиции на нужные другие? или слишком сложный запрос получится?
Просто попадаются и такие варианты для исправления:
31.01.9210
12.02.9098
25.09.8097
05.01.7889
19.02.6095
12.06.4864

можно заменить, можно. ничего сложного. гораздо сложнее вам найти и сформулировать
какие дефекты данных и каким именно сценарием вы собираетесь лечить
для каждого дефекта отдельно:
1) диагноз
2) сценарий - лекарство
а пока вы валите разные дефекты в одну кучу - нифига (кроме порчи данных) не ждите
например, во что хотите конвертнуть 31.01.9210 ?
a 31.01.0044 ?
а 31.01.0001 ?
а 13.01.5991 ?
14 ноя 13, 13:12    [15127562]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
orawish
например, во что хотите конвертнуть 31.01.9210 ?
a 31.01.0044 ?
а 31.01.0001 ?
а 13.01.5991 ?


В 31.01.1910
31.01.1944
31.01.1901
13.01.1991

Именно в моём случае мне просто надо проставить число "19" с 7-ой позиции, вместо цифр столетия.
14 ноя 13, 15:44    [15129291]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
lLocust
Member

Откуда:
Сообщений: 338
Alexander Warlord,

with CONTRACT as (
select to_date('31.01.9210', 'dd.mm.yyyy') DATE_OF_BIRTH from dual union all
select to_date('31.01.0044', 'dd.mm.yyyy') from dual union all
select to_date('31.01.0001', 'dd.mm.yyyy') from dual union all
select to_date('29.02.2332', 'dd.mm.yyyy') from dual union all
select to_date('31.01.5991', 'dd.mm.yyyy') from dual)
select add_months(DATE_OF_BIRTH, (1900 - trunc(extract(year from DATE_OF_BIRTH)/100)*100)*12)
from CONTRACT
14 ноя 13, 16:20    [15129659]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
lLocust
Member

Откуда:
Сообщений: 338
lLocust,

with CONTRACT as (
  select to_date('31.01.9210', 'dd.mm.yyyy') DATE_OF_BIRTH  from dual union all
  select to_date('31.01.0044', 'dd.mm.yyyy') from dual union all
  select to_date('31.01.0001', 'dd.mm.yyyy') from dual union all
  select to_date('29.02.2332', 'dd.mm.yyyy') from dual union all
  select to_date('31.01.5991', 'dd.mm.yyyy') from dual)
select  add_months(DATE_OF_BIRTH, (1900 - trunc(extract(year from DATE_OF_BIRTH)/100)*100)*12)
from    CONTRACT
14 ноя 13, 16:21    [15129669]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
with t as (
select to_date('31.01.9210', 'dd.mm.yyyy') d from dual union all
select to_date('31.01.0044', 'dd.mm.yyyy') from dual union all
select to_date('31.01.0001', 'dd.mm.yyyy') from dual union all
select to_date('29.02.2332', 'dd.mm.yyyy') from dual union all
select to_date('31.01.5991', 'dd.mm.yyyy') from dual)
select d, date'1901-1-1'+(d-trunc(d,'CC'))
from t ;
14 ноя 13, 17:02    [15130017]     Ответить | Цитировать Сообщить модератору
 Re: Замена символов в строке на нужной позиции  [new]
Alexander Warlord
Member

Откуда: Абхазия, Сухум
Сообщений: 314
lLocust
lLocust,

add_months(DATE_OF_BIRTH, (1900 - trunc(extract(year from DATE_OF_BIRTH)/100)*100)*12)


Супер!! спасибо! =)
15 ноя 13, 11:37    [15134374]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить