буквенная строка не соответствует форматной строке - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь запустить скрипт sql для тестовой базы данных.Я получаю сообщение об ошибке «буквальная строка не совпадает со строкой формата» - странная вещь, мой коллега выполняет тот же запрос на том же тестовом сервере и не получает никаких ошибок, только когда я его запускаю, я получаю ошибки,Я полностью потерян по этому вопросу.Куда мне идти отсюда?

Я выполняю запрос с командной строкой SQLPlus.Я получаю сообщение об ошибке в первой строке: выберите NVL .....

  select NVL(to_char(add_months(to_date(max(mem.birth_date)), + 780), 'yyyymmdd'), ' ')
    into local_turn_65_on
    from member mem
   where mem.member_id in (
         select cmr.member_id
         from case_member cmr
         where cmr.case_id = due_tasks_rec.case_id
           and cmr.current_row_ind = 'Y'
           and cmr.case_member_end_date = 29991231
           and cmr.case_member_role in ('AA','AB','AD','DP'))
     and mem.update_end_date = 29991231
     and mem.birth_date between
         (to_char(add_months(sysdate,-780), 'yyyymmdd'))
     and
         (to_char(add_months(sysdate,-780), 'yyyy') || '1231');

Если бы кто-то мог указать мне правильное направление, я был бы очень признателен!

Ответы [ 2 ]

1 голос
/ 28 марта 2019

тип данных число (8)

Затем необходимо указать модель формата для преобразования этого числа в дату; вместо

to_date(max(mem.birth_date))

вам нужно сделать:

to_date(max(mem.birth_date), 'YYYYMMDD')

или даже более явно:

to_date(to_char(max(mem.birth_date)), 'YYYYMMDD')

В данный момент ваш код использует настройки NLS текущего сеанса для получения используемой модели формата, и ошибка означает, что она не соответствует передаваемому вами значению. Причина, по которой ваш коллега может успешно выполнить один и тот же запрос, заключается в том, что его сеанс имеет разные настройки NLS. Вот почему вы не должны полагаться на настройки NLS (или неявные преобразования - они часто идут вместе), поскольку вы не можете контролировать, как другие люди будут выполнять ваш код.

Вы можете увидеть эффект на урезанном примере:

alter session set nls_date_format = 'DD-Mon-RR';

with mem (birth_date) as (select 20190328 from dual)
select NVL(to_char(add_months(to_date(max(mem.birth_date)), + 780), 'yyyymmdd'), ' ')
from mem;

ORA-01861: literal does not match format string

или даже проще:

with mem (birth_date) as (select 20190328 from dual)
select to_date(max(mem.birth_date))
from mem;

ORA-01861: literal does not match format string

Добавление формата модели приводит к дате:

with mem (birth_date) as (select 20190328 from dual)
select to_date(max(mem.birth_date), 'YYYYMMDD')
from mem;

TO_DATE(M
---------
28-Mar-19

и ваши настройки и преобразования теперь тоже работают:

with mem (birth_date) as (select 20190328 from dual)
select NVL(to_char(add_months(to_date(max(mem.birth_date), 'YYYYMMDD'), + 780), 'yyyymmdd'), ' ')
from mem;

NVL(TO_C
--------
20840328

Вы должны также хранить даты как даты , а не как числа, но это отдельная проблема ...

0 голосов
/ 28 марта 2019

Я полагаю, что дополнительные to_char должны были решить проблему, просто заставив этот числовой формат быть символьной строкой, а затем использовать to_date и добавить месяцы.

select NVL(to_char(add_months(to_date(to_char(max(mem.birth_date))), + 780), 'yyyymmdd'), ' ')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...