2016-01-21 10 views
0

Мне нужна ваша помощь в преобразовании дат Oracle.Oracle - Формат даты

У меня есть столбец, в котором хранятся такие даты 20150731 00:00:34.220. Тем не менее, я хотел бы показать столбец, как этот 20150731, но когда я запускаю простой оператор select для проверки вывода, я получаю следующую ошибку.

select TO_DATE('20150731 00:00:34.550','YYYYMMDD') 
from dual 

Ошибка

ORA-01830: формат даты картина заканчивается до преобразования всей строки ввода

+0

Привет ребята - тип данных столбца VARCHAR2. – netraider

+2

", который ** хранит ** даты, подобные этому ...", если он хранит данные подобно тому, как это не является столбцом даты, но вы можете вводить в заблуждение отображение даты по умолчанию, как они хранятся, - что не является правда. реальные даты в Oracle хранятся в виде наборов целых чисел, представляющих разные единицы времени. Эти числовые данные преобразуются в читаемый человеком формат по умолчанию db или путем преднамеренного действия через to_char(). Если данные хранятся в виде varchar, то, пожалуйста, скажите это явно. –

+1

, тогда все, что вам нужно, это ** substr (that_column_here, 1, 8) **, если я пропустил что-то –

ответ

1

Этот запрос

select TO_DATE('20150731 00:00:34.550','YYYYMMDD') 
from dual 

приводит к ошибкам

ORA-01830: дата формат изображения заканчивается перед преобразованием всей строки ввода

, потому что вы передаете строку с длиной 22 символов, но в то же время вы передаете формат даты с 8 символами, что явно не соответствует строке. Вы должны написать запрос в качестве

select to_timestamp('20150731 00:00:34.550','yyyymmdd hh24:mi:ss.ff3') 
    from dual 

Как для таблицы, так как у вас есть varchar2 столбца с датами, вы должны заботиться о содержании таблицы. Запрос требует соответствия exect исходной строки и формата даты.
Если вы хотите показать только дату без времени, и вам не нужно обрабатывать эту строку в качестве даты, вы можете сделать только

select substr('20150731 00:00:34.550', 1, 8) 
    from dual 
0

Это хранится в столбце даты и времени Oracle? Если нет, вам может понадобиться сделать некоторые манипуляции, чтобы получить его в формате DD-MON-YYYY. Если он хранится в виде текстовой строки, вы можете использовать SUBSTR(Date_field, Start_Position, Length), чтобы получить первые 8 символов. проверить эту ссылку SUBSTR

0

Если столбец является VARCHAR и вам нужен вывод даты:

select TO_DATE(substr('20150731 00:00:34.550', 1, 8),'YYYYMMDD') from dual 

Если это в формате даты и вам нужен вывод строки:

select to_char(your_column, 'YYYYMMDD') from your_table 
1

Что это тип данных столбца? Если это DATE (как он должен быть), то он не хранится в том формате, который вы говорите. Он хранится во внутреннем двоичном формате. Вы должны/должны использовать функцию to_char для отображения в любом формате, который вы выберете. Если вы не используете функцию to_char, она будет отображаться в формате, указанном NLS_DATE_FORMAT, который может быть указан в нескольких местах.

Что касается вашего примера, вы передали строковый формат yyyymmd hh: mi: ss.fff ', но вы предоставили маску описания только YYYYMMDD. Он не знает, что делать с компонентом времени. В дополнение к этому, когда вы SELECT TO_DATE, oracle также должен сделать подразумеваемый TO_CHAR, чтобы преобразовать его обратно в строку для отображения.

Кроме того, вы предоставили свой to_date строку символов, содержащую доли секунд. A DATE тип данных разрешает только секунды. Если вам нужны дробные секунды, вам нужно использовать TIMESTAMP, а не DATE.

0

Работа на предположении, что вы не пытаетесь изменить значение в столбце, а просто пытается показать его в формате YYYYMMDD -

Как упомянуто a_horse_with_no_name, вам просто нужно конвертировать это символьная строка. В этом примере я использовал systimestamp как моя дата:

SELECT TO_CHAR(systimestamp,'YYYYMMDD') FROM DUAL 

Результат:

20160121 

Это должно дать вам формат YYYYMMDD вы хотите отобразить.

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