добавление лет с ошибкой неверного номера только в выписке по делу - ORA-01722 - PullRequest
0 голосов
/ 10 декабря 2018

Прости меня, поскольку я новичок в этом.Я пытаюсь добавить год к дате в запросе.Год, который будет добавлен, основан на месяце / дне в базе данных.Если дата до 1 ноября, то год будет 2017, если после 1 ноября, то будет 2018. Я пробовал это несколькими способами (см. Ниже) и могу добавить годы в запросе, но когда я поставлюих в выписке дела я получаю сообщение об ошибке «Неверное число».

Использование to_char на дату:

   CASE
      WHEN to_char(au.creat_ts, 'MMDD') >= to_char('11/01/2018', 'MMDD') THEN
       to_char(to_date( '2017'||to_char(au.creat_ts,'MMDDHH24MISS'),
'YYYYMMDDHH24MISS' ), 'MM/DD/YYYY') 
      ELSE
      to_char(to_date( '2018'||to_char(au.creat_ts,'MMDDHH24MISS'), 'YYYYMMDDHH24MISS' ), 'MM/DD/YYYY') 
    END cmpltn_dt,

Добавление месяцев:

  CASE
      WHEN to_char(au.creat_ts, 'MMDD') >= to_char('11/01/2018', 'MMDD') THEN
       trunc(add_months(au.creat_ts,
                        floor(months_between(SYSDATE, au.creat_ts) / 12) * 12)) --calcx --add years
      ELSE
       trunc(add_months(au.creat_ts,
                        (floor(months_between(SYSDATE, au.creat_ts) / 12) - 1) * 12))
    END calcx,

Они запускаются ввыбрать из двойных утверждений без ошибок.Есть идеи?Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Если AU.CREAT_TS равно DATE, это работает нормально (имеется в виду: оно не дает сбоя):

SQL> with au (creat_ts) as
  2    (select date '2018-12-05' from dual
  3    )
  4  select
  5    CASE WHEN to_char(au.creat_ts, 'MMDD') >= to_char(to_date('11/01/2018', 'dd/mm/yyyy'), 'MMDD') THEN
  6              trunc(add_months(au.creat_ts, floor(months_between(SYSDATE, au.creat_ts) / 12) * 12))
  7         ELSE trunc(add_months(au.creat_ts, (floor(months_between(SYSDATE, au.creat_ts) / 12) - 1) * 12))
  8    END calcx
  9  from au
 10  ;

CALCX
-------------------
05.12.2018 00:00:00

SQL>

Обратите внимание на разницу: вы использовали

  CASE WHEN to_char(au.creat_ts, 'MMDD') >= to_char('11/01/2018', 'MMDD') THEN 

иэто вызывает ошибку, потому что '11/01/2018' является строкой;это не дата.Если вы хотите использовать дату, вы должны сообщить об этом Oracle.Как?Смотрите мой рабочий пример.

0 голосов
/ 10 декабря 2018

Ошибки происходят из двух появлений этого пункта:

to_char('11/01/2018', 'MMDD')

Вы передаете строку в качестве первого аргумента ( не дата), и Oracle по умолчанию принимает значениепытаясь преобразовать эту строку в число, которое выдает ошибку, которую вы видите.

Вам необходимо либо указать фактическую дату, явно преобразовав строку:

to_char(to_date('11/01/2018', 'MM/DD/YYYY', 'MMDD')

или с помощьюЛитерал ANSI:

to_char(date '2018-11-01', 'MMDD')

или, если это действительно фиксированное значение, не преобразуйте его вообще, просто сделайте:

'1101'

или если вам передают эту строку из другого места -и вы, конечно, уверены в формате - мы substr() извлекаем нужные вам биты, не пытаясь отбросить их через дату.

Между прочим, преобразование значений в даты и из них и объединение битов строквместе выглядит немного грязно и подвержен ошибкам.И если эта фиксированная дата всегда является первым в месяце, вы можете изменить выражение вашего дела, чтобы оно смотрело только на месяц, например, через extract().

...