Oracle OCI:带日期字段的查询
使用OCI编译的客户端:10.2.0.4.0Oracle OCI:带日期字段的查询,oracle,date,where,oracle-call-interface,clause,Oracle,Date,Where,Oracle Call Interface,Clause,使用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 看起来很简单,当使用SQLPl
服务器: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的应用程序执行时,此查询会返回OCI\u NO\u数据
始终。开始时,日期值也是一个占位符,但我发现即使给出像'05-JUL-08'
这样的文字也不起作用。我尝试了以下方法:
- 我已经尝试了一些基本的方法:从客户端查询数据库是可行的。就是这个给我带来了麻烦
- 以下方法确实有效:
SELECT CODIGO FROM LOG WHERE TEL = :telnumber
- 执行
ALTER SESSION SET NLS\u DATE\u FORMAT=“DD-MM-YYYY”在服务器和客户机中的查询之前的代码>。相同的结果:服务器返回数据,客户端
OCI\u NO\u数据
- 尝试将
格式更改为DATE\u PROC
。同样的结果日期()
- 搜索,搜索,搜索。没有回答
SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');
在服务器中:返回:“BancoOne”(良好值)在OCI应用程序中:返回OCI\u NO\u数据 在服务器中:返回:“BancoOne”
在OCI应用程序中:返回“BancoOne” 所以问题是,如果两个应用程序都访问同一个DB服务器,为什么OCI应用程序会给出不同的结果
此外,为了澄清OCI应用程序的用途:它有一个由用户配置的查询。其想法是,用户将根据需要调整查询以适应目标数据库中的日期字段,这就是为什么我不应该在代码中包含“alter session set nls_Date_format”语句的原因,因为我不知道日期格式。这样,我希望为用户提供灵活性,而不依赖于特定的日期格式。这有意义吗?有什么建议吗?记录是如何插入的 日期字段确实存储时间信息,因此当使用sysdate插入记录时,日期字段将包含该天内记录的不同“值”。当您执行date_proc='05-JUL-08'时,您的意思是date_proc正好等于2008年7月5日12:01:00。如果使用sysdate在12:01插入记录,则不会返回该记录。您是否尝试过使用中间或trunc 以下是一个例子:
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
您的列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'
,因为这种格式将被排序为原始日期。我想你问错了问题
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),原因是有人在电脑上更改了一天中的时间。当他们将日期/时间恢复到正确的时间时,应用程序开始正常工作。Hi Vincent,查询的第一个版本使用了to_date()函数。问题就是这样开始的。在我的代码中,日期中没有字母,但我也不知道日期的具体格式。我在问题中添加了关于OCI应用程序如何工作的更多信息。嗨,RC,我尝试了trunc()。我添加了关于如何插入记录的更多信息。
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');