首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Oracle零日期

使用Oracle零日期
EN

Stack Overflow用户
提问于 2010-01-18 21:09:29
回答 5查看 7.1K关注 0票数 7

我有一个包含现有数据的应用程序,它的date列中有Zero。

当我从sqlplus查看它时,我看到: 00-DECEMB

当我对这一列使用转储函数时,我得到: Typ=12 Len=7: 100,100,0,0,1,1,1

我需要使用来自.Net的现有数据(不更改数据、数据结构或甚至现有的sql语句)。

我该怎么读这个值,或者写它。

db版本从8到11各不相同。

如果能帮上忙,我们将不胜感激

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-23 20:02:22

归根结底,我的问题没有解决方案。

我所做的是,每当业务逻辑尝试输入零日期时,我将其更改为1/1/0001,并且每当我从数据库获得1/1/0001或异常时,我在业务逻辑中的行为就好像我获得了零日期一样。

票数 1
EN

Stack Overflow用户

发布于 2010-01-19 05:55:39

我不确定你实际上期望实现什么,但是你可以通过DBMS_STATS.CONVERT_RAW_VALUE生成“粗糙”的一天。

代码语言:javascript
运行
复制
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);

所以可能有帮助的是一个函数

代码语言:javascript
运行
复制
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;
/

然后可以在查询中使用它,如下所示

代码语言:javascript
运行
复制
select case when date_col = trash_date then null else date_col
from table...
票数 3
EN

Stack Overflow用户

发布于 2010-01-18 21:23:14

恭喜,这是一个守门员!

Typ=12 Len=7: 100100 0 0 1 1 1

转储中的元素是世纪、年、月、日、小时、分钟、秒。所以你得到的是0-0-0000,这绝对不是一个有效的日期...

代码语言:javascript
运行
复制
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>

编辑

我用加里的绝妙技巧把一个没有约会的人塞进了一张桌子……

代码语言:javascript
运行
复制
SQL> select * from d
  2  /

D1
---------
00-DECEMB
19-JAN-10

SQL> 

所以至少我们知道你的“魔术”开发者是怎么做到的。现在我们要做的就是绕过他们的聪明。

我认为做到这一点的唯一方法--你可能不会喜欢--是使用视图构建一个API层。

代码语言:javascript
运行
复制
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。猜猜发生了什么?

代码语言:javascript
运行
复制
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对新行的作用与预期一致...

代码语言:javascript
运行
复制
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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2086175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档