2016-12-10 3 views
0

У меня есть исходное приложение, которое использует тип varchar для хранения дат. Все даты должны быть в форме yyyymmdd.Ошибка Oracle to_date

Так что теперь, когда я запускаю этот запрос

select (case when PLE_DATE = '00000000' then null else to_date(PLE_DATE,'yyyymmdd') end) PLE_DATE 
from PLE_DATE_TAB 

я в состоянии видеть данные из SQLDeveloper прекрасно. Но когда я пытаюсь вставить эти данные в другую таблицу с целевым столбцом даты. Это ошибка даты месяца должна быть между 1-м и последним днем ​​месяца. Я изо всех сил пытаюсь понять это . Буду признателен за любую оказанную помощь. И исходные, и целевые таблицы находятся в oracle db.

+3

** varchar тип для хранения дат ** почему? и почему нет типа «Timestamp» или «date»? –

+0

Показать данные в столбце 'PLE_DATE' –

+0

, это хороший вопрос. Я думаю, что это несколько устаревшее приложение, которое они используют для хранения даты в форме varchar. В этом случае у меня нет выбора, кроме как иметь дело с тем, что у меня есть. – user1751356

ответ

0

Предположим теперь, что данные действительно должны быть в формате 'yyyymmdd'. (Вы можете написать простой запрос, чтобы выбрать все строки, в которых эта строка даты не соответствует восьми символам или содержит цифры, но эти возможности приведут к разным сообщениям об ошибках, а не к тем, которые вы получили.)

Проверить для «плохих дат» вы могли бы сделать что-то вроде этого:

select ple_date from ple_date_tab 
where to_number(substr(ple_date, 7, 2)) = 31 
    and to_number(substr(ple_date, 5, 2)) in (2, 4, 6, 9, 11) 
; 

вы можете написать что-то подобное, чтобы найти все даты 29 февраля и проверку года, чтобы убедиться, что это високосный год. Или, возможно, искать день, равный 00 вместо 01 или выше, или день больше 31, в любой месяц (тогда вторая часть условия ГДЕ не понадобится).

Если это не помогает, мы можем думать о других вещах, но это то, что я бы первым проверил (на основе полученного сообщения об ошибке).

1

Написать функцию

Create function Junk_to_date(junk in VARCHAR2) return date as 

Begin 

Return to_date(junk,'yyyymmdd'); 
Exception 
    When others then 
     Return null ; 
End; 

Затем используйте его в ваш выбор.

Select Junk_to_date(PLE_DATE) 
From...