我有一个包含现有数据的应用程序,它的date列中有Zero。
当我从sqlplus查看它时,我看到: 00-DECEMB
当我对这一列使用转储函数时,我得到: Typ=12 Len=7: 100,100,0,0,1,1,1
我需要使用来自.Net的现有数据(不更改数据、数据结构或甚至现有的sql语句)。
我该怎么读这个值,或者写它。
db版本从8到11各不相同。
如果能帮上忙,我们将不胜感激
发布于 2010-02-23 20:02:22
归根结底,我的问题没有解决方案。
我所做的是,每当业务逻辑尝试输入零日期时,我将其更改为1/1/0001,并且每当我从数据库获得1/1/0001或异常时,我在业务逻辑中的行为就好像我获得了零日期一样。
发布于 2010-01-19 05:55:39
我不确定你实际上期望实现什么,但是你可以通过DBMS_STATS.CONVERT_RAW_VALUE生成“粗糙”的一天。
create or replace function stats_raw_to_date (p_in raw) return date is
v_date date;
v_char varchar2(25);
begin
dbms_stats.CONVERT_RAW_VALUE(p_in, v_date);
return v_date;
exception
when others then return null;
end;
/
select x, dump(x) y from (select stats_raw_to_date('64640000010101') x from dual);所以可能有帮助的是一个函数
create or replace function trash_date return date deterministic is
v_date date;
begin
dbms_stats.CONVERT_RAW_VALUE('64640000010101', v_date);
return v_date;
end;
/然后可以在查询中使用它,如下所示
select case when date_col = trash_date then null else date_col
from table...发布于 2010-01-18 21:23:14
恭喜,这是一个守门员!
Typ=12 Len=7: 100100 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> 所以至少我们知道你的“魔术”开发者是怎么做到的。现在我们要做的就是绕过他们的聪明。
我认为做到这一点的唯一方法--你可能不会喜欢--是使用视图构建一个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触发器,这些触发器实际上会将零个日期插入到底层表中(同样,使用Gary的函数)。此外,为了维护相同的对象名称,您可能需要在不同的模式中构建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>https://stackoverflow.com/questions/2086175
复制相似问题