Нахождение неправильной отметки даты и времени в Oracle 10g - PullRequest
0 голосов
/ 07 декабря 2011

Я работаю с некоторыми данными в базе данных Oracle 10g, в частности с массовым обновлением и чтением информации о метках времени. Мне пришлось конвертировать из формата MM/DD/YYYY HH24:MI:SS в формат YYYY-MM-DD HH24:MI:SS из-за требований бизнеса. Кроме того, временная метка хранится как VARCHAR вместо собственной даты-времени из-за требований бизнеса.

К сожалению, теперь у меня проблемы с запуском операций выбора для моих данных.

В частности, при выполнении следующего выбора я получаю ORA-01861: литерал не соответствует строке формата:

SELECT datetime_stamp 
  from entrytable 
where 
  to_date(datetime_stamp, 'YYYY-MM-DD HH24:MI:SS') 
  between 
     TO_DATE('11/27/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
     and 
     TO_DATE('12/06/2011 23:59:59', 'MM/DD/YYYY HH24:MI:SS') 
  and rownum < 1000

Я подтвердил, что неверным аргументом является to_date (datetime_stamp, 'YYYY-MM-DD HH24: MI: SS'), но теперь у меня есть 400 тысяч строк данных для анализа, чтобы попытаться найти плохую строку.

Можно ли как-нибудь заставить Oracle вернуть строку, которая генерирует ошибку ORA-01861?

Я пытался использовать REGEXP_LIKE, чтобы найти данные, которые не соответствуют [0-9] [0-9] [0-9] [0-9] - [0-9] [0-9] - [0 -9] [0-9] [0-9] [0-9]: [0-9] [0-9]: [0-9] [0-9], но все строки соответствуют этому регулярному выражению .

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011
create function td(s varchar2) return number is
begin
  if to_date(s, 'YYYY-MM-DD HH24:MI:SS') is not null then return 1; end if;
  return null;
exception
  when others then return 0;
end;

, а затем

select datetime_stamp from entrytable where td(datetime_stamp) = 0
1 голос
/ 07 декабря 2011

временная метка хранится как VARCHAR вместо собственной даты-времени из-за требований бизнеса

Вау, ужасный аргумент для этого.Ни одно деловое требование не должно заставлять разработчика базы данных использовать VARCHAR для хранения дат.Это должно быть от невежества или лени от человека, который разработал эту схему.Если вы не можете определить как дату, то это не дата, а строка цифр и символов, которые могут или не могут подтвердить любой формат вообще.Не говоря уже о потере выполнения каких-либо функций дат, сравнений и т. Д. Не хорошо !!!

В любом случае, я бы сказал, обострите эту проблему с менеджером проекта или кем бы то ни было и сделайте приоритетным изменение даты или метки времени,Если вы пытаетесь преобразовать to_date на лету, даже если вы очистите поле VARCHAR, вы наверняка столкнетесь с этим снова.

Попытайтесь исправить это сейчас, а не связывайтесь с очисткой строк.

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