Пытаясь объединить пару TO_DATE(SUBSTR), чтобы получить комбинированную дату 'dd-mon-yyyy' из строк..?

Ранее я спрашивал о преобразовании строк в даты и их форматировании. Разделение строки на основе позиции символа в ORACLE 11g SQL

Вот решение, которое я придумала, где WKENDING - это VARCHAR2, а RYEAR - дата. WKENDING содержит данные, которые выглядят как "523" (ммдд), а RYEAR - "2012".

UPDATE OB_SEL_LST84_AGG_WKEND  SET WKENDYEAR =  (TO_DATE((TO_DATE(substr(WKENDING,3,2)),'dd')||(TO_DATE(substr(WKENDING,0,1)),'mon')||(TO_DATE(TO_CHAR(RYEAR)),'yyyy')),'dd-mon-yyyy');

Теперь я получаю сообщение об ошибке "ORA-00907: отсутствует правильная скобка", я дважды проверил скобки, и они выглядят правильно для меня... любая помощь будет отличной... спасибо!

ОБНОВЛЕНИЕ - Посмотрев на синтаксис вышеописанного, я подумал, что, возможно, слишком много попыток преобразования TO_DATE продолжаются. Итак, я сократил это до этого..

UPDATE OB_SEL_LST84_AGG_WKEND  SET WKENDYEAR =  (TO_DATE((substr(WKENDING,3,2))||(substr(WKENDING,0,1))||TO_CHAR(RYEAR)),'dd-mon-yyyy');

Я все еще получаю пропущенную ошибку в скобках, хотя.. ARGH!

1 ответ

Решение

Поскольку тип данных wkendyear столбец DATEВам просто нужно

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )

Это предполагает, конечно, что все ваши строковые данные могут быть преобразованы в действительную дату. Как только у вас есть wkending из 0229 и ryear из 2013 (или некоторая другая комбинация строк, которые не являются действительной датой), TO_DATE Функция собирается выбросить исключение. Это одна из причин сохранения дат в VARCHAR2 колонки вообще проблематичны.

Если не все ваши данные могут быть правильно преобразованы в DATE, вы можете создать функцию, которая пытается сделать преобразование и возвращает NULL если есть исключение. Например

CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2, p_format IN VARCHAR2 )
  RETURN DATE
IS
  l_dt DATE;
BEGIN
  l_dt := to_date( p_str, p_format );
  RETURN l_dt;
EXCEPTION
  WHEN others THEN
    RETURN NULL;
END;

Ваш UPDATE заявление тогда станет

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = my_to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )

Вы также можете искать строки, где строка не может быть преобразована в дату

SELECT *
  FROM OB_SEL_LST84_AGG_WKEND  
 WHERE my_to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' ) IS NULL
   AND (wkending IS NOT NULL or ryear IS NOT NULL)
Другие вопросы по тегам