客户编制与其他综合收益:10.2.0.4.0
服务器:Oracle9i企业发9.2.0.4.0

有问题的查询是:

SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = '05-JUL-08'

表说明:

SQL>describe LOG;

TEL NOT NULL VARCHAR2(15)
CODIGO NOT NULL VARCHAR2(20)
DATE_PROC NOT NULL DATE

为简单,因为它可能看起来,当直接执行服务器上SQLPlus,返回的结果,但在执行时从应用程序使用的其他综合收益,这种查询将返回 OCI_NO_DATA 总是.在开始的,该日期的价值也是一个占位,但我发现,甚至给人一种文字喜欢 '05-JUL-08' 没有工作。我试图如下:

  • 我已经尝试了基础:查询数据库自客户的工作。这是一个给我的麻烦
  • 以下工作:

    SELECT CODIGO FROM LOG WHERE TEL = :telnumber
    
  • 执行 ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY"; 查询之前在两个服务器和客户。同样的结果:服务器返回的数据、客户 OCI_NO_DATA

  • 试图改变 DATE_PROC 格式,结合这一有用的 TO_DATE().同样的结果。
  • 搜查,搜查,搜查。没有答案

我有点绝望找到一个答案,将感谢任何的帮助,并可以提供进一步的细节作必要的。谢谢。

--- 进一步信息 ---

update log set DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS') where CODIGO='BancoOne';

我已经尝试了不同的组合采用小数部分保留()以及"改变届会议nls_date_format"...这就是我得到:

SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');

在服务器:返回:"BancoOne"(良好的价值)
在其他综合收益的应用程序: 返回OCI_NO_DATA

SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

在服务器:返回:"BancoOne"
在其他综合收益的应用程序:返回"BancoOne"

因此,问题是,为什么其他综合收益的应用程序给予不同的结果,如果这两个访问相同的数据库服务器?

此外,为了澄清目的的其他综合收益的应用程序:它有一个查询可配置的用户。这个想法是,用户将适应查询所需符合的新领域存在于目标数据库,这就是为什么我不应该包括"改变届会议nls_date_format"的发言,在我的代码,因为我不会知道的日期格式。这种方式,我想要提供灵活性,用户,并不依赖于具体的日期格式。这有意义吗?任何建议?

有帮助吗?

解决方案

你柱DATE_PROC是一个日期,你应该 总是 把它比作一个日期, 从来没有 依赖于隐性的数据的转换。

试试这个:

SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = DATE '2008-07-05'

或者这样:

SELECT CODIGO 
  FROM LOG 
 WHERE TEL = :telnumber 
   AND DATE_PROC = to_date('05-JUL-08', 'DD-MON-RR')

如果可以的话,避免使用的日期格式 在代码中 使用的字母数月(因为代码 将会失败 当你改变默认的语言)和只有两个字符用于年(含糊的世纪)。我喜欢用 'YYYY/MM/RR' 因为这种格式将作为原始日期。

其他提示

如何记录插?

新的领域不存储信息的时间,并因此当插入记录的使用sysdate,日期的领域将包含不同的"价值观"的记录内的那一天。当你执行date_proc='05-JUL-08',你是说哪里date_proc等于完全第5月在2008年12:01:00.如果你插入记录在12:01与sysdate,它将不会返回。你有没有尝试过用一间小数部分保留或?

这里是一个例子:

drop table test_date;
create table test_date (id number, ud date);

insert into test_date values (1, '15-jan-10');
insert into test_date values (2, '15-jan-10');
insert into test_date values (3, '15-jan-10');
insert into test_date values (6, sysdate);    -- sysdate as of writing is 15-JAN-2010 08:01:55
insert into test_date values (7, sysdate);    -- sysdate as of writing is 15-JAN-2010 08:01:55
insert into test_date values (8, '16-jan-10');
commit;

select id, ud, to_char(ud, 'dd-MON-yyyy HH:MM:SS') from test_date where ud = '15-jan-10';
---------------------- ------------------------- --------------------
1                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
2                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
3                      15-JAN-10                 15-JAN-2010 12:01:00      

select id, ud, to_char(ud, 'dd-MON-yyyy HH:MM:SS') from test_date where trunc(ud) = '15-jan-2010';
---------------------- ------------------------- --------------------
1                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
2                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
3                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
6                      15-JAN-10                 15-JAN-2010 08:01:55                                                        
7                      15-JAN-10                 15-JAN-2010 08:01:55

我会说你是问错了问题。

Oracle依赖于共享SQL的性能及时你坚持一个字符串中,如'20080705',SQL不能共享。详细信息 在这里,.

所以数据的价值应该是一个占位,应该是正确的数据类型(日期)。例 在这里, 应该帮助做到这一点。

这就是说,如果这工作

SELECT CODIGO FROM LOG 
WHERE TEL = 11223344 AND 
trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

但是,这并不

SELECT CODIGO FROM LOG 
WHERE TEL = 11223344 
AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');

我会尝试

SELECT TO_CHAR(DATE_PROC,'DD-MM-YYYY HH24:MI:SS') FROM LOG 
WHERE TEL = 11223344 AND 
trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

我们只有这个错误(OCI_NO_DATA)获得由别人改变的小时的一天在他们的电脑。当他们把日期/时间回到正确的时间,应用程序开始工作,确定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top