Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проверка даты на валидность без перехвата исключения  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
Как можно проверить в SQL дату на валидность непосредственно в операторе запроса и выполнить соответствующее действие без перехвата исключений. Например что-то типа:
insert into
   table1(name,birthdate)
select
   name,
   case when (valid_date(birthdate_in_txt,'dd/mm/уууу'))
      then to_date(birthdate_in_txt,'dd/mm/уууу')
      else to_date('01/01/2000','dd/mm/уууу')
   end
from
   table2
Есть ли подобная функция в стандартном SQL?
11 авг 08, 14:34    [6052383]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
publexus
Есть ли подобная функция в стандартном SQL?
Нет.
11 авг 08, 14:50    [6052500]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
1. в оракловом sql такой функции, разумеется, нет
2. имхо, правильный путь - именно ексепшен (в pl/sql) ловить
3. но если очень хочется - то можно самому налабать в sql ~
with t1 as (select '31/06/2006' as s from dual
      union select '30/06/2006'      from dual)
    ,t2 as (select s
                  ,regexp_substr(s,'[^/]+',1,1) s1
                  ,regexp_substr(s,'[^/]+',1,2) s2
                  ,regexp_substr(s,'[^/]+',1,3) s3
              from t1
              )
     select s
           ,case when least(s1,s2,s3) is not null
                  and rtrim(s1||s2||s3,'0123456789') is null
                  and s3 between 1000 and 9999
                  and s2 between 1 and 12
                  and s1 = extract (day from to_date(s2||'.'||s3,'mm.yyyy')-1+s1)
                  then 1
                  else 0
                  end d_flag
       from t2;
11 авг 08, 15:08    [6052630]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
Понятно, пришлось написать свою функцию:
CREATE OR REPLACE function valid_date(p_date in varchar2, p_format in varchar2, p_default in date)
    return date
as
begin
    begin
        return to_date(p_date, p_format);
    exception when others then 
        return p_default;
    end;
end;
Хоть она и простая, но все равно, обидно, что разработчики Oracle не позаботились об этом(((
11 авг 08, 17:26    [6053550]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
publexus
Понятно, пришлось написать свою функцию:
CREATE OR REPLACE function valid_date(p_date in varchar2, p_format in varchar2, p_default in date)
    return date
as
begin
    begin
        return to_date(p_date, p_format);
    exception when others then 
        return p_default;
    end;
end;
Хоть она и простая, но все равно, обидно, что разработчики Oracle не позаботились об этом(((
Обработка others - это плохо. Лучше уж value_error.
11 авг 08, 18:33    [6053951]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
publexus
Хоть она и простая, но все равно, обидно, что разработчики Oracle не позаботились об этом(((
Кстати, как писали не один раз, нет никакой гарантии, что таким методом получаете верный результат.
Если в текстовом поле находится значение - 01/02/03 - то из этих подстрок - 01 02 03 - что число, что месяц, а что год?
11 авг 08, 19:03    [6054041]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
andreymx
publexus
Хоть она и простая, но все равно, обидно, что разработчики Oracle не позаботились об этом(((
Кстати, как писали не один раз, нет никакой гарантии, что таким методом получаете верный результат.
Если в текстовом поле находится значение - 01/02/03 - то из этих подстрок - 01 02 03 - что число, что месяц, а что год?

Здесь неопределенности нет, т.к. я знаю расположение данных на входе и явно указываю формат считывания даты(p_format).
12 авг 08, 13:59    [6056765]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
publexus
andreymx
как писали не один раз, нет никакой гарантии, что таким методом получаете верный результат.
Если в текстовом поле находится значение - 01/02/03 - то из этих подстрок - 01 02 03 - что число, что месяц, а что год?
Здесь неопределенности нет, т.к. я знаю расположение данных на входе и явно указываю формат считывания даты(p_format).
Вы сами себе противоречите.
Если бы Вы точно "знали расположение данных на входе", у Вас бы не возникали подобные темы для обсуждения.
А если у Вас на входе всё-таки произвольный текст, то Вы и получите произвольный результат.
Кстати, под маску 'dd/mm/уууу' вполне подходит и мой пример - 01/02/03, и 1/2/3, и еще куча других
SELECT  TO_DATE('01/02/03', 'dd/mm/yyyy') FROM dual UNION ALL
SELECT  TO_DATE('1/2/3',    'dd/mm/yyyy') FROM dual UNION ALL
SELECT  TO_DATE('1.2.3',    'dd/mm/yyyy') FROM dual UNION ALL
SELECT  TO_DATE('1-2-3',    'dd/mm/yyyy') FROM dual
Row#TO_DATE('01/02/03','DD/MM/YYYY')
101.02.0003
201.02.0003
301.02.0003
401.02.0003
12 авг 08, 15:51    [6057546]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
andreymx
publexus
andreymx
как писали не один раз, нет никакой гарантии, что таким методом получаете верный результат.
Если в текстовом поле находится значение - 01/02/03 - то из этих подстрок - 01 02 03 - что число, что месяц, а что год?
Здесь неопределенности нет, т.к. я знаю расположение данных на входе и явно указываю формат считывания даты(p_format).
Вы сами себе противоречите.
Если бы Вы точно "знали расположение данных на входе", у Вас бы не возникали подобные темы для обсуждения.

Я знаю порядок следования и формат - день/месяц/год, поскольку данные вводились по маске, но сами значения могут быть неверными, например 30/02/1900, поэтому все равно надо проверять на валидность.
14 авг 08, 14:31    [6067307]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
publexus
..Я знаю порядок следования и формат - день/месяц/год, поскольку данные вводились по маске, но сами значения могут быть неверными, например 30/02/1900, поэтому все равно надо проверять на валидность.

всё таки подумайте еще..
вот вы написали процедуру, которая вместо того, чтобы помочь оператору найти и исправить его ошибку - просто скрывает её, да еще ценой искажения данных
14 авг 08, 15:00    [6067489]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
orawish
publexus
..Я знаю порядок следования и формат - день/месяц/год, поскольку данные вводились по маске, но сами значения могут быть неверными, например 30/02/1900, поэтому все равно надо проверять на валидность.

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

Понятное дело, что корректность данных, не проверяющаяся констрейнтами в базе данных должна быть по возможности проверена до записи этих данных в базу. Это само-сабой разумеещеся. Спасибо, что пытаетесь мне помочь. Но я просто хочу пресечь дальнейшее развитие диалога, т.к. у меня стояла совсем другая задача: собрать кое-какие статистические данные по архивной базе, которая уже не находится в работе, поэтому вопрос о модернизации структуры и алгоритма функционирования не стоит. Спасибо за комментарии.
14 авг 08, 15:18    [6067655]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
Elic
Member

Откуда:
Сообщений: 29979
STFF Дата в формате number
18 авг 08, 09:45    [6076710]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Проверка даты на валидность без перехвата исключения  [new]
Ася2013
Guest
Что-нибудь изменилось с того момента?
Конечно, я могу написать собственную процедуру, которая будет проверять как надо, но это, имхо, велосипед. Есть ли нативная функция проверки даты?
Спасибо.
29 янв 13, 21:01    [13847364]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
-2-
Member

Откуда:
Сообщений: 15330
Ася2013
Что-нибудь изменилось с того момента?
Elic перестал давать stff и rtfm
29 янв 13, 22:09    [13847567]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Ася2013
Что-нибудь изменилось с того момента?
Конечно, я могу написать собственную процедуру, которая будет проверять как надо, но это, имхо, велосипед. Есть ли нативная функция проверки даты?
Спасибо.

и еще календарь майя (не путать и июйля ) закончился.
разве не ясно? не будет никакой нативной функции на ваши сугубо субъективные хотеловы.
30 янв 13, 11:41    [13849531]     Ответить | Цитировать Сообщить модератору
 Re: Проверка даты на валидность без перехвата исключения  [new]
-2-
Member

Откуда:
Сообщений: 15330
Можно просто в to_date написать маску, которая не будет давать исключение.
30 янв 13, 12:27    [13849837]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить