Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle OCI:带日期字段的查询_Oracle_Date_Where_Oracle Call Interface_Clause - Fatal编程技术网

Oracle OCI:带日期字段的查询

Oracle 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

使用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的应用程序执行时,此查询会返回
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
    格式更改为
    日期()
    。同样的结果
  • 搜索,搜索,搜索。没有回答
我有点急于找到答案,希望能得到任何帮助,并能根据需要提供更多的细节。谢谢

---进一步资料---

我尝试了使用trunc()和“alter session set nls_date_format”的不同组合。。。这就是我得到的:

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');