Пытаясь объединить пару 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)