Oracle OCI:查询的日期现场
题
客户编制与其他综合收益: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)获得由别人改变的小时的一天在他们的电脑。当他们把日期/时间回到正确的时间,应用程序开始工作,确定。