2014-01-31 2 views
1

Есть ли опция или настройка, которая сообщит Netezza о игнорировании недопустимых дат? Весь INSERT не работает в примере ниже, потому что в третьей строке исходной таблицы указана неверная дата. Я ожидал бы, что оскорбительная строка может быть пропущена, но вставить нулевые строки кажется немного экстремальным.Netezza INSERT - игнорировать недопустимые даты?

Я пробовал следующее, но это не удалось. Альтернативой является разбор даты источника и проверки каждого компонента для действия (в том числе дней/месяц, високосные годы и т.д ..)

insert into db.test (cmclmn, effdt, efftm) 
     select cmclmn, case when to_date(effdt,'yyyymmdd') is null 
         then null 
         else to_date(effdt,'yyyymmdd') end, 
       cast(lpad(efftm,6,0) as time) as efftm 
      from db.test_src 
      ; 

Весь сценарий:

CREATE TABLE db.test 
(
     cmclmn integer, 
     effdt date, 
     efftm time 
     ) 
DISTRIBUTE ON (cmclmn); 

drop table db.test_src; 
create table db.test_src 
(
     cmclmn integer, 
     effdt integer, 
     efftm integer) 
     distribute on (cmclmn); 

insert into db.test_src (cmclmn, effdt, efftm) values (1,20140120, 102000); 
insert into db.test_src (cmclmn, effdt, efftm) values (2,20140121, 231212); 
insert into db.test_src (cmclmn, effdt, efftm) values (3,0,111111); 
insert into db.test_src (cmclmn, effdt, efftm) values (4,2014,90909); 

insert into db.test (cmclmn, effdt, efftm) 
     select cmclmn, to_date(effdt,'yyyymmdd'), cast(lpad(efftm,6,0) as time) as efftm 
      from db.test_src 
      ; 

ответ

0

Вы можете создать пользователя определенные функции для выполните полный тест. В вашем случае, возможно, некоторые простые вещи делать:

insert into db.test (cmclmn, effdt, efftm) 
    select cmclmn, to_date(effdt,'yyyymmdd'), cast(lpad(efftm,6,0) as time) as efftm 
    from db.test_src 
    where effdt between 20010000 and 20150000 and 
      effdt % 10000 between 0101 and 1231 and 
      effdt between 01 and 31; 

Я не уверен, что если когда-либо Netezza оптимизирует запросы так to_date() может выполняться до фильтра. Если да, то используйте case, а также:

insert into db.test (cmclmn, effdt, efftm) 
    select cmclmn, 
      (case when effdt between 20010000 and 20150000 and 
         effdt % 10000 between 0101 and 1231 and 
         effdt % 100 between 01 and 31 
       then to_date(effdt,'yyyymmdd') 
      end), 
      cast(lpad(efftm,6,0) as time) as efftm 
    from db.test_src 
    where effdt between 20010000 and 20150000 and 
      effdt % 10000 between 0101 and 1231 and 
      effdt % 100 between 01 and 31; 

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

0

Netezza Analytics Package 3.0 поставляется с некоторыми образцовыми функциями LUA, isdate() и todate() - это две функции.

Эти функции ловут код возврата, прежде чем он удалит запрос. isdate() возвращает логический результат, который сообщает вам, является ли дата действительной или нет, todate() вернет значение даты Netezza или null, если входящий аргумент не является допустимой датой.

Спасибо.

Смежные вопросы