Frage

Client mit OCI zusammengestellt: 10.2.0.4.0
Server: Oracle9i Enterprise Edition Veröffentlichung 9.2.0.4.0

Die problematische Abfrage lautet:

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

Tabelle Beschreibung:

SQL>describe LOG;

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

So einfach wie es aussehen könnte, wenn sie direkt auf dem Server mit SQLPlus ausgeführt, es gibt ein Ergebnis, aber wenn sie von der App ausgeführt, die OCI verwendet, diese Abfrage gibt OCI_NO_DATA immer . Am Anfang war das Datum Wert auch ein Platzhalter, aber ich fand heraus, dass auch eine wörtliche wie '05-JUL-08' geben funktioniert nicht. Ich habe folgendes versucht:

  • Ich habe die Grundlagen versucht: vom Client der DB Abfrage funktioniert. Es ist das eine, die mir Mühe
  • gibt
  • Die folgende funktioniert:

    SELECT CODIGO FROM LOG WHERE TEL = :telnumber
    
  • Ausführen ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY"; vor der Abfrage sowohl auf dem Server und dem Client. Gleiches Ergebnis: Server gibt Daten, Client OCI_NO_DATA

  • Versuchte DATE_PROC Format zu ändern, die Kombination mit dem Einsatz von TO_DATE(). Gleiches Ergebnis.
  • Gesucht, gesucht, gesucht. Keine Antwort

Ich bin ein bisschen verzweifelt eine Antwort zu finden, jede mögliche Hilfe würde es begrüßen, und so viele weitere Details zur Verfügung stellen kann je nach Bedarf. Danke.

--- Weitere Informationen ---

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

Ich habe verschiedene Kombinationen versucht, mit trunc () und „alter Sitzung Satz NLS_DATE_FORMAT“ ... und das ist, was ich bekommen:

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

Server: Rückkehr: "BancoOne" (guter Wert)
In OCI App: Returns OCI_NO_DATA

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

Server: Rückkehr: "BancoOne"
In OCI App: Returns "BancoOne"

Der Punkt ist also, warum die OCI App unterschiedliche Ergebnisse geben, wenn beide den gleichen DB-Server zugreifen?

, auch den Zweck der OCI App zu klären: Es hat eine Abfrage durch den Benutzer konfiguriert werden. Die Idee ist, dass der Benutzer die Abfrage anpassen wird, wie in dem Ziel passen mit dem Datumsfeld vorhanden gewünschte DB, das ist, warum ich nicht soll „alte Sitzung Satz NLS_DATE_FORMAT“ Aussagen in meinem Code enthält, da ich nicht das Datumsformat kennen. Auf diese Weise möchte ich Flexibilität für den Benutzer zur Verfügung zu stellen, und verlassen Sie sich nicht auf bestimmte Datumsformate. Macht das Sinn? Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Ihre Spalte DATE_PROC ist ein Datum, sollten Sie immer vergleichen Sie es mit einem Datum und nie stützen sich auf die implizite Datenkonvertierung.

Versuchen Sie diese:

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

oder folgt aus:

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

Wenn Sie können, verzichtet auf ein Datumsformat in Ihrem Code , dass Verwendungen Buchstaben für Monate (da der Code fehl , wenn Sie die Standardsprache ändern) und nur zwei Zeichen für Jahre (Zweideutigkeit Jahrhundert). Ich mag zu verwenden 'YYYY/MM/RR', da dieses Format wird als das ursprüngliche Datum sortiert werden.

Andere Tipps

Wie wurden eingefügt die Datensätze?

Datumsfelder lagerten Zeitinformationen und damit, wenn Datensätze mit sysdate Einfügen, wird das Datumsfeld verschiedene „Werte“ für Datensätze innerhalb dieses Tages enthält. Wenn Sie date_proc = '05 -JUL-08' ausführen, sagen Sie, wo date_proc entspricht genau den 5. Juli 2008 bei 00.01.00. Wenn Sie den Datensatz um 12:01 Uhr mit sysdate eingeführt, es wird nicht zurückgeschickt werden. Haben Sie versucht, eine zwischen oder trunc mit?

Hier ist ein Beispiel:

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

Ich würde sagen, Sie die falsche Frage stellen.

Oracle setzt auf SQL für die Leistung zu teilen, und wenn Sie eine Zeichenfolge in, wie ‚20080705‘ kleben, kann der SQL nicht mit anderen geteilt werden. Details hier .

So sollte der Datenwert ein Platzhalter sein und soll von dem richtigen Datentyp (DATE) sein. Das Beispiel hier sollte helfen, das zu tun.

Das heißt, wenn diese Werke

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

, aber das bedeutet nicht

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

Ich würde versuchen,

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

Wir hatten gerade diesen Fehler (OCI_NO_DATA) bekommen von jemandem verursacht auf ihrem PC die Stunde des Tages ändern. Als sie das Datum / Uhrzeit zurück zum richtigen Zeitpunkt gesetzt, begann die Anwendung ok arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top