Поздравляю, это хранитель!
Тип = 12 Лен = 7: 100,100,0,0,1,1,1
Элементами этой свалки являются век, год, месяц, день, час, минута, секунда. Итак, у вас есть полдень по 0-0-0000, что определенно не является действительной датой ...
SQL> create table d (d1 date)
2 /
Table created.
SQL> insert into d values (to_date('00-00-0000', 'dd-mm-yyyy'))
2 /
insert into d values (to_date('00-00-0000', 'dd-mm-yyyy'))
*
ERROR at line 1:
ORA-01847: day of month must be between 1 and last day of month
SQL>
редактировать
Я использовал отличный трюк Гэри, чтобы разбить нулевую дату в таблице ....
SQL> select * from d
2 /
D1
---------
00-DECEMB
19-JAN-10
SQL>
Так что, по крайней мере, мы знаем, как это сделали ваши разработчики "Magic". Теперь все, что нам нужно сделать, это обойти их ум.
Я думаю, что единственный способ сделать это - и вам, вероятно, это не понравится - это создать уровень API, используя представления ....
SQL> create or replace view v_d as
2 select case when d1 = trash_date then null else d1 end as d1
3 from d
4 /
View created.
SQL> select * from v_d
2 /
D1
---------
19-JAN-10
SQL>
Не менее тревожным аспектом этого является то, что вам понадобятся триггеры INSTEAD IF, которые фактически вставляют нулевые даты в базовую таблицу (опять же, используя функцию Гэри). Кроме того, чтобы поддерживать одинаковые имена объектов, вам, вероятно, потребуется построить API в другой схеме.
Так что я не минимизирую объем работы, которая в этом задействована. Проблема в том, что предыдущие разработчики столкнулись с большими техническими проблемами. Теперь вы должны оплатить этот долг (учитывая, что вы не хотите погасить капитал, переписав базу данных).
последние новости
Я только что натолкнулся на это забавное свидание в моем собственном окружении, которое предлагает альтернативное объяснение этих забавных свиданий. Я добавил столбец DATE в таблицу, в которой были строки. Я использовал предложение DEFAULT, чтобы установить значение по умолчанию sysdate. Угадай, что случилось?
SQL> select * from t69
2 /
ID
----------
1
2
SQL> alter table t69 add col2 date default sysdate not null
2 /
Table altered.
SQL> select * from t69
2 /
ID COL2
---------- ---------
1 00-DECEMB
2 00-DECEMB
SQL>
Для записи sysdate работает, как и ожидалось, для новых строк ...
SQL> insert into t69 (id) values (3)
2 /
1 row created.
SQL> select * from t69
2 /
ID COL2
---------- ---------
1 00-DECEMB
2 00-DECEMB
3 28-APR-10
SQL>