Newsgroup: it.comp.software.database
Titolo: Problema su data in Oracle

Scusate la banalita' della richiesta, ma non sono un conoscitore di
Oracle.
Il problema e' questo:
ho una tabella FATTURE che e' composta tra gli altri dai campi:
NUMERO_FATTURA VARCHAR2(10)
DATA_FATTURA DATE
Devo alimentarla estraendo i dati da una tabella FATTURE_APPOGGIO che
contiene, tra gli altri i campi:
NUM_FAT VARCHAR2(8)
DAT_FAT VARCHAR2(10)
Nessun problema per il travaso NUM_FAT ---> NUMERO_FATTURA
mentre incontro dei problemi poiche' il campo DAT_FAT puo' essere
NULL.
Viceversa, se DAT_FAT non e' NULL contiene sicuramente una data
corretta
nel formato DD/MM/YYYY
La mia istruzione banalissima e' questa :
insert into FATTURE
(SELECT NUM_FAT, TO_DATE(DAT_FAT,'DD/MM/YYYY')
FROM FATTURE_APPOGGIO);
L'errore che esce fuori e':
ORA-01847: day of month must be between 1 and last day of month
Ho provato ad updatare la tabella inserendo una data valida laddove
incontravo
il campo a NULL nella tabella FATTURE_APPOGGIO ed ovviamente tutto ok.
Riesco a risolvere il problema inserendo qualche clausola o devo
sdoppiare
ilprogramma caricando prima solamente i record con DAT_FAT a NULL
e poi quelli con con DAT_FAT valorizzata?
Grazie, Michele.

> Torakiki


Esclusivamente date valide. Questo e' un dato di fatto al 100%.
Questo perche' a sua volta questa tabella viene alimentata da un altra
tabella
dove la data e' definita come DATE(oppure non e' presente e quindi
genera il campo a NULL).
E comunque ho fatto una prova, inserendo una data valida ed una data
null (nella tabella dove
la data e' definita come varchar2 e quindi accetta di tutto) e
l'errore e' proprio quello da
me segnalato.
In pratica quindi la mia richiesta e':
esiste una clausola da abbinare all'istruzione TO_DATE con la quale
inserire comunque a NULL
le date che in input sono a NULL, evitando l'errore segnalato?

> Torakiki

 Ah, a proposito, versione DB?
Sia sulla 9 che sulla 11g.
Se vuoi simulare perfettamente il mio problema, basta che ti crei una
tabella
con 1 campo PIPPO varchar2(10).
Inserisci due record: il primo a null ed il secondo con il valore
"12/12/2007"
Poi lanci una select to_date(PIPPO,'DD/MM/YYYY') from tabella
e vedrai che ti becchi l'errore 1847.
Ovviamente quello che vorrei ottenere io invece e' che mi estragga sia
il campo
contenente la data, sia il campo null.

 
ciao,
il problema deve essere un'altro:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning option
JServer Release 9.2.0.1.0 - Production
SQL> create table t3 (dt varchar2(10));
Table created.
SQL> insert into t3 values (null);
1 row created.
SQL>  insert into t3 values ('12/12/2007');
1 row created.
SQL> select * from t3;
DT
----------
12/12/2007
SQL>  select to_date(dt,'dd/mm/yyyy') from t3;
TO_DATE(D
---------
12-DEC-07
SQL> 
C'è questa nota su metalink, vedi se ti aiuta:
Problem Description: 
==================== 
 
You are trying to insert blanks into a date column and you are getting 
the  
Oracle error ORA-01847: day of month must be between 1 and last day of 
month. 
 
Problem Explanation: 
==================== 
 
SQL> create table mytab (c1 date); 
 
SQL> insert into mytab values('       '); 
 
ORA-01847: day of month must be between 1 and last day of month 
 
 
SQL> insert into mytab values(to_date('       ','DDMONYY')); 
 
ORA-01847: day of month must be between 1 and last day of month
Solution Description: 
===================== 
 
You cannot insert blanks into a column of type DATE.  A DATE column can 
only contain valid dates or a null value (if the column does not have a 
NOT 
NULL constraint).  See the SQL Language Reference Manual for more  
information about the DATE datatype. 

> Torakiki


Grazie a tutti.
Il problema era che io (che, ripeto, Oracle e l'SQL in generale lo
conosco di vista)
davo per scontato il null nei campi.
In realta' c'era uno degli Nmila record che caricavo che non era a
null, ma
conteneva un blank.
Ho applicato RTRIM(LTRIM) ed e' andato a posto.
Scusatemi se vi ho fatto perdere tempo per una banalita'.

> Torakiki


SI, infatti e' quel "trim" che mi ha fatto venire il dubbio. :-)
Io caricavo la tabellina di prova con 2 record, estraendo dalla
tabella "vera" i
primi 2 record.
La sfiga, sempre in agguato, voleva che su 16.387 record che devo
caricare,
l'unico contenente un blank nel campo data era il secondo record :-)
E quindi anche le mie prove andavano a p*tt**e.
Di nuovo grazie a tutti per le risposte sollecite.