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

Откуда:
Сообщений: 28
есть столбец часть строк могут быть просто буквы , а часть числа - дата

как вывести типа
SELECT * FROM z_dim
WHERE to_date(dat,'dd-mon-yyyy hh24:mi:ss')<= to_date('01-авг-2006','dd.mm.yyyy hh24:mi:ss')

-выдает ошибку ORA-01858:a non-numeric character was found where a numeric was expected
18 сен 06, 16:49    [3151407]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
1. обработать EXCEPTION на PL/SQL
2. срочно поменять дизайн БД
18 сен 06, 16:52    [3151426]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Elic
Member

Откуда:
Сообщений: 29979
STFF Дата в формате number
18 сен 06, 16:55    [3151463]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
только что мусолили типа того
18 сен 06, 16:59    [3151501]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Совершенно согласен с предыдущими ораторами.
Если уцепиться за фразу автора

автор
есть столбец часть строк могут быть просто буквы , а часть числа - дата


то

  1  with tab1
  2  as
  3  (select 'aaabc' col1 from dual
  4   union all
  5   select 'aaawer' col1 from dual
  6   union all
  7   select '01012006' from dual
  8   union all
  9   select '01022006' from dual
 10    )
 11  select * from
 12  (select * from tab1 where translate(col1,'_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '_')
 13   is not null)
 14*  where to_date(col1)<= to_date('01-AUG-2006','dd.mm.yyyy hh24:mi:ss')
SQL> /

COL1
--------
01012006
01022006

SQL>

Опять же в десятке - regexp_replace.
Ограниченность решения полностью осознаю :-)
18 сен 06, 17:02    [3151544]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
dmidek
Совершенно согласен с предыдущими ораторами.
Если уцепиться за фразу автора

автор
есть столбец часть строк могут быть просто буквы , а часть числа - дата


то

  1  with tab1
  2  as
  3  (select 'aaabc' col1 from dual
  4   union all
  5   select 'aaawer' col1 from dual
  6   union all
  7   select '01012006' from dual
  8   union all
  9   select '01022006' from dual
 10    )
 11  select * from
 12  (select * from tab1 where 
 translate(col1,'_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '_')
 13   is not null)
 14*  where to_date(col1)<= to_date('01-AUG-2006','dd.mm.yyyy hh24:mi:ss')
SQL> /

COL1
--------
01012006
01022006

SQL>

Опять же в десятке - regexp_replace.
Ограниченность решения полностью осознаю :-)
Ну, Dmidek, от тебя такого не ожидал...
19 сен 06, 05:38    [3153163]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Владимор Конев
Ограниченность решения полностью осознаю :-)
Ну, Dmidek, от тебя такого не ожидал...[/quot]
Владимор, что не понравилось ?
19 сен 06, 07:28    [3153220]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
dmidek
Владимор, что не понравилось ?
Привет, Dmidek!
Выделенная строка мне не понравилась...
Это же не лениво было тебе столько буковок в неё колотить...
Я бы, для выделения из строки именно цифровых символов, вот так записал бы:
with tab1
  as (
        select 'aaabc' col1 from dual
        union all
        select 'aaawer' col1 from dual
        union all
        select 'aaawer01002006' col1 from dual
        union all
        select '01012006' from dual
        union all
        select '01022006' from dual
     )
select col1,
       translate(col1, '$1234567890', '$') only_letter,
       translate(col1, '1234567890'||translate(col1, '$1234567890', '$'), '1234567890') as only_digit
  from tab1
Хотя тоже не очень-то кошерно...

З.Ы.
Спасибо за тестовые данные :)
19 сен 06, 07:46    [3153244]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Хотя, по количеству набитых символов то на то и вышло
19 сен 06, 07:48    [3153246]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Elic
Member

Откуда:
Сообщений: 29979
Владимор Конев
Хотя, по количеству набитых символов то на то и вышло
Зато шансов пропустить какую-нибудь букву практически не осталось.
19 сен 06, 08:21    [3153293]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Привет!
Ты знаешь, я так классно выучил латинский алфавит ...

Более серьезный момент.
Я исходил из очень ограниченного допущения,
что у товарища или даты, или буквы.
В противном случае происходит "вырубление" :-)
Твой вариант дополнительно отсекает смешанные цифро- буквенные строки
и в этом его преимущество.
Зато мой форматами даты a la 01/01/2006 не побрезгует :-)

P.S. А данными, мы это, всегда ... :-)
19 сен 06, 08:22    [3153294]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
dmidek
Я исходил из очень ограниченного допущения,
что у товарища или даты, или буквы.
В противном случае происходит "вырубление" :-)


Мой вариант в этом плане тоже поддается улучшению

    with tab1
    as
    (select 'aaabc' col1 from dual
     union all
     select 'aaawer838' col1 from dual
     union all
     select '01-01-2006' from dual
     union all
     select '01022006' from dual
     )
   select * from 
 (select * from tab1 where translate(col1,'_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '_') = col1)
  where to_date(col1)<= to_date('01-AUG-2006','dd.mm.yyyy hh24:mi:ss')
/
19 сен 06, 08:30    [3153307]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Владимор Конев
Хотя, по количеству набитых символов то на то и вышло

ну тут стереть можно аж 18
translate(col1, '1'||translate(col1, '$1234567890', '$'), '1') as only_digit
19 сен 06, 10:43    [3154072]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
orawish
ну тут стереть можно аж 18
translate(col1, '1'||translate(col1, '$1234567890', '$'), '1') as only_digit
Согласен ;)
19 сен 06, 10:59    [3154193]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
лично я в науке никогда простых путей не искал...
WITH
days AS
(
	SELECT trim(TO_CHAR(LEVEL, '00')) days
	FROM dual
	CONNECT BY LEVEL <= 31
),
years AS
(
	SELECT ''||years years
	FROM(
	SELECT LEVEL years
	FROM dual
	CONNECT BY LEVEL <= 2100
	) WHERE years >= 1700

),
monthes AS
(
	SELECT UPPER(TO_CHAR(TRUNC(SYSDATE, 'rr')-15+LEVEL*31, 'mon')) monthes 
	FROM dual
	CONNECT BY LEVEL <= 12
),
tab1
    AS
    (SELECT 'aaabc' col1 FROM dual
     UNION ALL
     SELECT 'aaawer838' col1 FROM dual
     UNION ALL
     SELECT '01-авг-2006' FROM dual
     UNION ALL
     SELECT '01022006' FROM dual
     )
SELECT * FROM tab1
WHERE SUBSTR(col1, 1, 2) IN (SELECT days FROM days)
AND	  SUBSTR(UPPER(col1), 4, 3) IN (SELECT monthes  FROM monthes )
AND	  SUBSTR(col1, 8, 4) IN (SELECT years FROM years) 
19 сен 06, 11:27    [3154366]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Ах так !
Ну ладно , ухожу в десятку

  1  with tab1
  2  as
  3  (
  4   select 'aAAaabc' col1 from dual
  5   union all
  6   select 'aaawer234' col1 from dual
  7   union all
  8   select '01/01/2006' from dual
  9   union all
 10   select '01022006' from dual
 11  )
 12  select * from
 13  (select * from tab1
 14  where regexp_replace(col1, '[[:alpha:]]') = col1)
 15* where to_date(col1)<= to_date('01-AUG-2006','dd.mm.yyyy hh24:mi:ss')
SQL> /

COL1
----------
01/01/2006
01022006

SQL>
19 сен 06, 11:53    [3154586]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
Я всё равно самый нудный!!!
select TO_DATE('01-AUG-2006','dd.mm.yyyy hh24:mi:ss') from dual
ORA-01858 a non-numeric character was found where a numeric was expected
19 сен 06, 11:55    [3154607]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
andreymx
Я всё равно самый нудный!!!
select TO_DATE('01-AUG-2006','dd.mm.yyyy hh24:mi:ss') from dual
ORA-01858 a non-numeric character was found where a numeric was expected


Это у кого как

SQL> select * from v$version
  2  /

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
PL/SQL Release 9.2.0.5.0 - Production
CORE    9.2.0.6.0       Production
TNS for Solaris: Version 9.2.0.5.0 - Production
NLSRTL Version 9.2.0.5.0 - Production

SQL> select to_date('01-AUG-2006','dd.mm.yyyy hh24:mi:ss') from dual
  2  /

TO_DATE(
--------
01.08.06

SQL>

SQL> select * from v$version
  2  /

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Solaris: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> select to_date('01-AUG-2006','dd.mm.yyyy hh24:mi:ss') from dual
  2  /

TO_DATE(
--------
01.08.06

SQL> ^C^C

Но в рамках кампании борьбы с большим количеством букв, безусловно
поддерживаю удаление маски времени
19 сен 06, 12:01    [3154658]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Dmitriy Fil
Member

Откуда:
Сообщений: 28
Всем спасибо , написал:
в основной таблице сделал столбец i с айдишниками по возрастающей
от 1..3152645
+ добавил столбец ndate с типом дата.


BEGIN
FOR y IN 1..3152645
LOOP
BEGIN
UPDATE z_dim SET ndate=to_date(dat,'dd.mm.yyyy hh24:mi:ss') WHERE i=y;
COMMIT;

exception
when others then
INSERT INTO z_dim_idate VALUES(y); --таблица с номерами плохих строк - в которых не дата
END;

END LOOP;
END;
19 сен 06, 14:29    [3155823]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
Takurava
Member

Откуда:
Сообщений: 1776
Dmitriy Fil
в основной таблице сделал столбец i с айдишниками по возрастающей
Это ты зря current of
19 сен 06, 14:33    [3155851]     Ответить | Цитировать Сообщить модератору
 Re: как проверить является ли строка - датой ?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116169
Dmitriy Fil
Всем спасибо , написал:

Не за что :-)
19 сен 06, 14:34    [3155860]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить