2014-01-21 3 views
1

У меня есть поле varchar2, которое содержит только даты (по любой неизвестной причине), но некоторые регистры не форматируются «to_date».Обновление формата даты в Oracle не работает

мне нужно сделать запрос, используя формат даты [например: выберите * из users_table где status_date> «2014-01-21»], но появляется сообщение о «ORA-01861: буквальный не соответствует формату строка ".

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

update users_table set status_date = to_date(status_date, 'dd-mm-yy') where status_date > '2014-01-21'; 

Он выполняет, но не регистр не изменилось. Пожалуйста, как я могу решить эту проблему?

+4

Добавить новый столбец в таблицу с типом даты. Обновите его как можно лучше из столбца varchar. Отбросьте столбец varchar и рассмотрите это как урок о том, почему вы всегда должны использовать соответствующие типы данных. –

ответ

2

Это снова вызовет ошибку, если status_date имеет строки даты в нескольких форматах.

update users_table 
    set status_date = to_char(to_date(status_date, 'dd-mm-yy'),'YYYY-MM-DD') 
    where to_date(status_date ,'dd-mm-yy') > to_date('21-01-2014','DD-MM-YYYY'); 
+0

спасибо !! Оно работает! У меня было всего два типа, поэтому у меня не было проблем. – danfigue

1

Я не уверен, что это выполнит то, что вы в конечном итоге хотите, чтобы избежать разных форматов даты в таблице. Я бы сделал так, как предлагает @DanBracuk, добавить новый столбец в таблицу с типом даты, используя «alter table».

Затем измените запрос, чтобы поместить результат to_date в новую колонку (убедившись, что матч ваших форматов, как предполагает @MaheswaranRavisankar). Я подозреваю, что у вас может быть несколько форматов в вашей таблице дат varchar, где строка формата «dd-mm-yy» не будет соответствовать. Таким образом, это может быть ручным и итеративным. Продолжайте собирать остальные форматы varchar, помещая типы дат в свой новый столбец, пока не будет пустых столбцов даты. Затем избавьтесь от столбца даты varchar и никогда больше этого не делайте :)

Затем вы можете добавить ограничение в новый столбец данных, если это применимо в вашем случае, например, с помощью ограничения, отличного от нуля.

alter table users_table modify actual_status_date date NOT NULL; 

И если вы сделаете это, убедитесь, что ограничение заканчивается в любом сценарии создания таблицы у вас есть.

Смежные вопросы