2015-11-10 3 views
0

У меня есть таблица, и я хочу проверить формат datetime записей в соответствии с YYYYMMDD,HH24MISS. Если формат даты и времени моих записей неверен, напишите сообщение об ошибке. Как я могу сделать функцию или процедуру в PL/SQL?Как я могу проверить формат моей даты?

+1

Если вы сохраняете значения, используя собственные форматы (например, 'date'), тогда вам не нужно беспокоиться о формате. –

+0

с типом данных этой колонки? если дата - формат будет соответствовать параметру nls_date_format. Если вы хотите подобрать этот столбец в другом формате - просто используйте функцию to_char. – Tatiana

+0

Вы правы, но я не хранил эти записи, и мне нужно его проверить. У вас есть идея? – FatihCeng

ответ

1

Вы можете написать функцию, как это:

CREATE OR REPLACE FUNCTION CheckDateString(str IN VARCHAR2) RETURN DATE IS 
BEGIN 
    RETURN TO_DATE(str,'YYYYMMDD,HH24MISS'); 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN NULL; 
END CheckDateString; 

и использовать его как этот

SELECT * 
FROM my_table 
WHERE CheckDateString(DATE_STRING) IS NULL 
    AND DATE_STRING IS NOT NULL; 

Конечно следующая точка действия будет исправить неправильные значения и изменить тип данных эта колонка до DATE, соотв. TIMESTAMP.

+0

Спасибо @ Wernfried Domscheit. Я использовал для изменения типа данных, как этот SELECT * FROM my_table WHERE CheckDateString (to_number (to_char (CRTTAR, 'YYYYMMDDHH24MISS'))) IS NULL И CRTTAR НЕ НЕТ; – FatihCeng

+0

Как вы думаете, это правильный путь? – FatihCeng

+0

Тип входных данных должен быть VARCHAR, я изменил его. –

0

Если вы хотите получить данные, которые имеют нужный формат, возможно, вы могли бы сделать что-то вроде этого: В противном случае я бы пошел с ответом Вернфрида Думшайта.

  1. Cast дата, как DateTime из таблицы

    select *, cast(yourDateColumn as datetime) as verifiedDate into #tempTable from yourTable

  2. Затем проверьте данные yourTable против вас данных в #tempTable

    select * from yourTable yt inner join #tempTable tt on yt.yourDateColum = tt.verifiedDate and yt.ID = tt.ID

1

В случае, если ваш столбец VARCHAR2, и вы должны проверить, что значения внутри него могут быть преобразованы в дату, используя нужный формат, это может быть решением:

declare 
    v_foo_date date; 
begin 
    for r_date in (
    select date_col from my_table 
) loop 
     begin 
     v_foo_date := to_date(r_date.date_col, 'YYYYMMDD,HH24MİSS'); 
     exception when others then 
      dbms_output.put_line('error in validating value ' || r_date.date_col); 
     end; 
    end loop; 
end; 
Смежные вопросы