Re[2]: [Ora] Парсинг строки в дату
От: Пингвиненок Россия  
Дата: 21.03.07 13:02
Оценка: 3 (1)
Здравствуйте, TMU, Вы писали:

Лови. Список доступных форматов можешь пополнить в курсоре:
DECLARE
   date_variable     VARCHAR2 (100) := TO_CHAR (SYSDATE, 'mon dd yyyy');

   FUNCTION is_date (STRING VARCHAR2)
      RETURN BOOLEAN
   IS
      CURSOR c (separator VARCHAR2)
      IS
         SELECT f
           FROM (SELECT UPPER (d.d || separator || m.m || separator || y.y
                              ) AS f
                   FROM (SELECT 'DD' AS d
                           FROM DUAL) d,
                        (SELECT 'MM' AS m
                           FROM DUAL
                         UNION ALL
                         SELECT 'RM' AS m
                           FROM DUAL
                         UNION ALL
                         SELECT 'MONTH' AS m
                           FROM DUAL
                         UNION ALL
                         SELECT 'MON' AS m
                           FROM DUAL) m,
                        (SELECT 'YYYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'SYYYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'IYYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'YYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'YY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'Y' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'IYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'IY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'I' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'Y,YYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'YEAR' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'SYEAR' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'RR' AS y
                           FROM DUAL) y
                 UNION ALL
                 SELECT UPPER (m.m || separator || d.d || separator || y.y
                              ) AS f
                   FROM (SELECT 'DD' AS d
                           FROM DUAL) d,
                        (SELECT 'MM' AS m
                           FROM DUAL
                         UNION ALL
                         SELECT 'RM' AS m
                           FROM DUAL
                         UNION ALL
                         SELECT 'MONTH' AS m
                           FROM DUAL
                         UNION ALL
                         SELECT 'MON' AS m
                           FROM DUAL) m,
                        (SELECT 'YYYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'SYYYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'IYYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'YYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'YY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'Y' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'IYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'IY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'I' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'Y,YYY' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'YEAR' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'SYEAR' AS y
                           FROM DUAL
                         UNION ALL
                         SELECT 'RR' AS y
                           FROM DUAL) y) f;

      temp   DATE;
      res    BOOLEAN;
   BEGIN
      res := TRUE;

      FOR r IN c ('.')
      LOOP
         BEGIN
            temp := TO_DATE (STRING, r.f);
            RETURN TRUE;
         EXCEPTION
            WHEN OTHERS
            THEN
               NULL;
         END;
      END LOOP;

      RETURN FALSE;
   EXCEPTION
      WHEN OTHERS
      THEN
         RETURN FALSE;
   END;

BEGIN

   IF is_date (date_variable)
   THEN
      DBMS_OUTPUT.put_line (date_variable || ' - Date.');
   ELSE
      DBMS_OUTPUT.put_line (date_variable || ' - Not date.');
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (SQLERRM);
END;

Может подойдет. У меня пока работает.
То что меня не убивает, делает меня умнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.