Сравнение формата даты оракула ORA-01858 - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть этот запрос на производство, который не имел проблем до вчерашнего дня:

 SELECT E.ID       
    FROM EXAM_STUD_ENTERANCE E,
         EXAM_REGISTRATION R
   WHERE     E.EXAM_REG_ID = R.ID
         AND E.USER_NAME ='user'          
         AND E.BLOCK = 1
         AND E.STATUS = 1
      AND TO_DATE (TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS'),
                'DD/MM/YYYY HH24:MI:SS') >
            TO_DATE (
                  TO_CHAR (R.EXAM_DATE, 'DD/MM/YYYY')
               || ' ' || R.EXAM_START_TIME
              ,
               'DD/MM/YYYY HH24:MI:SS')

   AND TO_DATE (TO_CHAR (SYSDATE, 'DD/MM/YYYY HH24:MI:SS'),
                'DD/MM/YYYY HH24:MI:SS') <
            TO_DATE (
                  TO_CHAR (R.EXAM_DATE, 'DD/MM/YYYY')
               || ' ' || R.EXAM_END_TIME
              ,
               'DD/MM/YYYY HH24:MI:SS');

Но теперь я получаю ошибку

ORA-01858: нечисловой символбыл найден там, где ожидалось числовое значение

Тип столбцов EXAM_START_TIME и EXAM_END_TIME равен NVARCHAR2 (100) и хранит данные типа «16: 40»;EXAM_DATE - ДАТА

1 Ответ

0 голосов
/ 27 ноября 2018

Вчера кто-то вставил неверное значение в один из этих столбцов времени

Сделайте

SELECT * FROM EDUMAN_EXAM.EXAM_REGISTRATION 
WHERE 
  NOT( 
    REGEXP_LIKE(EXAM_START_TIME, '^\d\d:\d\d:\d\d$') AND
    REGEXP_LIKE(EXAM_END_TIME, '^\d\d:\d\d:\d\d$')
  )

Найдите неверные данные и удалите их

Примечание: вы опубликовалиsql, который указывает, что столбцы времени хранят hh:mm:ss, и вы сказали «это работает», но затем вы заявили, что столбцы времени не хранят секунды.Если они сохраняют секунды, используйте запрос, как указано выше.Если они не сохраняют секунды, уменьшите шаблон регулярных выражений до \d\d:\d\d

В качестве дополнительного комментария вы никогда не должны были принимать решение сохранять эти временные данные в виде строки.DATETIME, который содержит EXAM_START_DATE, может так же легко удерживать время, и если вы просто хотите, чтобы DATE без временной части, вы могли TRUNC(some_datetime) удалить компонент времени

Сохранить данные в столбцеправильный тип, и вы не получите эту проблему, и вам не придется вступать в этот нелепый date -> string -> concatenate -> parse процесс с тысячами записей

...