Προς το περιεχόμενο

Πρόσθεση Date σε Oracle... Πρόβλημα!!


joss

Προτεινόμενες αναρτήσεις

Δημοσ.

Παρακαλώ βοηθήστε!!! Απόγνωση...

 

 

Έχω μια ιστοσελίδα σε jsp, ζητάω από java.util.Date το Date(),

 

1. θέλω να το καταχωρώ σε Oracle db 9i αλλά όσο ξέρω πρέπει να το γυρίζω σε java.sql.Date που χάνει τις ώρες και τα λεπτά...

 

2. Μετά θέλω να παίρνω ακόμη ένα Date() και να το δείχνω σε textbox σε ότι format νάναι (πχ. 'dd/mm/yyyy'), να μπορεί να το αλλάζει ο χρήστης και να το περνάει σε servlet μέσω request.getParameter(). (Εδώ δεν με ενδιαφέρουν ώρες και λεπτά) Νομίζω όμως ότι το getParameter() γυρνάει μόνο String;

 

Πως μπορώ να αλλάξω αυτό το String και να το στείλω σαν Date στην βάση;

 

Το java.sql.Date.valueOf νομίζω παίρνει μόνο το format "yyyy-MM-dd" όσο έχω δοκιμάσει όμως η Oracle δεν δέχεται αυτό το format...

 

Καμιά βοήθεια;;;;

Δημοσ.

Τελικά το insert στη βάση το έκανα με το SYSDATE και δούλεψε κανονικά. Όταν το καλώ το κάνω toString() για να το βάλω σε textbox.

 

Όμως όσο και να προσπαθώ με το SimpleDateFormat δεν μπορώ να βρω τρόπο να το κάνω update...

 

 

>

public Date2SQL()
{

java.util.Date utilDate = new java.util.Date();

SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd");
String stringDate = dateFormat.format(utilDate);
java.util.Date d;
	
try 
{
	d = dateFormat.parse(stringDate);
	dateFormat.applyPattern("yyyy-MM-dd");
	stringDate = dateFormat.format(d);
} 
catch (Exception e) 
{
	e.printStackTrace();
}

sqlDate = java.sql.Date.valueOf(stringDate);

}

 

Το πρόβλημα είναι όμως ότι χτυπάει στο parse και δεν δέχεται τους μήνες σαν 04 (παίρνει μόνο το 4), όπως επίσης και ότι δεν δέχεται αυτό το format της Date για να το βάλει στη βάση.

 

κανένας βοήθεια;

Δημοσ.
Νομίζω όμως ότι το getParameter() γυρνάει μόνο String;

 

Πως μπορώ να αλλάξω αυτό το String και να το στείλω σαν Date στην βάση;

 

Το java.sql.Date.valueOf νομίζω παίρνει μόνο το format "yyyy-MM-dd" όσο έχω δοκιμάσει όμως η Oracle δεν δέχεται αυτό το format...

 

Καμιά βοήθεια;;;;

 

Η getParameter(String) γυρίζει String γιατί το URL για να περνάς τις παραμέτρους με http είναι String :). Δεν μπορείς να γυρίσεις κάποιο object.

 

Για να κάνεις convert ένα String σε java.util.Date, χρησιμοποιείς όπως πολύ σωστά διαπίστωσες το java.text.SimpleDateFormat.

 

>

String inputDate;
//δηλώνεις την μορφή του String σου στο DateFormat
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

//Πέρνεις το date object σου
Date date = dateFormat.parse(inputDate);

//δημιουργείς ένα νέο sql Date βάση του Date που έχεις.
java.sql.Date sql = new java.sql.Date(date.getTime()); 

Δημοσ.

Ευχαριστώ Cue αλλά το πρόβλημά μου δεν λύθηκε...

 

η εντολή java.sql.Date sql = new java.sql.Date(date.getTime());

 

δημιουργεί κανονικά ένα sql.Date object όμως το sql.Date είναι σε μορφή yyyy/MM/dd και η Oracle δέχεται μόνο dates της μορφής dd/MM/yyyy ή dd-MM-yyyy.

Πως μπορώ να γυρίσω το date μου με αυτή τη μορφή; Δεν έχω βρει τίποτα...:(

 

Επίσης με χειροκίνητη insert εντολή το date που στέλνω είναι της μορφής '20-04-2005' και το δέχεται κανονικά. Άρα σκέφτηκα να φτιάξω ένα string της μορφής αυτής και να το στείλω στο insert. Δηλαδή:

 

>
 public String getStringFromDate(java.sql.Date dt)
 {
   String date2insert;
   int month = dt.getMonth();

   if (month<10)
     date2insert = dt.getDate() + "-0" + (month+1) + "-" + (dt.getYear()+1900);
   else
     date2insert = dt.getDate() + "-" + (month+1) + "-" + (dt.getYear()+1900);
   
   return date2insert;
 }

 

To month πρέπει να είναι της μορφής 11 ή 05 και το dt.getMonth() το γυρνάει σαν 5 γι'αυτό και έχω το if. Όμως πάλι μου βγάζει λάθος πως το format του μήνα δεν είναι σωστό...

 

Help?!

Δημοσ.
...και η Oracle δέχεται μόνο dates της μορφής dd/MM/yyyy ή dd-MM-yyyy.

Πως μπορώ να γυρίσω το date μου με αυτή τη μορφή; Δεν έχω βρει τίποτα...:(

 

Επίσης με χειροκίνητη insert εντολή το date που στέλνω είναι της μορφής '20-04-2005' και το δέχεται κανονικά. Άρα σκέφτηκα να φτιάξω ένα string της μορφής αυτής και να το στείλω στο insert.

 

κοιτα, η oracle, δέχετε οτι θέλεις, αρκει να την προειδοποιήσεις :)

 

Εγώ, επειδη ξερω καλα oracle, αλλα σε java ειμαι μέτριος,

θα εκανα τα πάντα στη java με strings, και θα αφηνα την oracle, να μετατρέπει σε/απο date sta select/insert αντίστοιχα.

Αν ο χρήστης (ή το προγραμμα java) στείλει στη βάση κατι που δεν μετατρέπεται σε ημ/νιά, απλα η oracle θα σου απαντησει με τον κωδικο λαθους, που θα το χειριστείς αναλογα (πχ. αν στείλεις strings με day>31, me month>12, M/D <0, 30-Feb, 31-Apr, κλπ...)

Φυσικα αν ξερεις καλά java, μπορεις να κανεις τους ελεγχους στον κωδικα, αλλα δικο σου θέμα. αφου εχει τις δυνατοτητες η βαση, δεν βλεπω το λογο να γραφω κωδικα.

 

πχ.

σε πινακα T, me pedio Dz of type Date, κανεις

 

SELECT TO_CHAR( dz ,'dd/mm/yyyy') from T ;

και παιρνεις string (varchar2 σε ορολογία oracle)

 

INSERT INTO T (dz) VALUES (TO_DATE( '15/1/2005' ,'dd/mm/yyyy') ) ;

για να εισάγεις string se date column

επειδη το type date εχει μεσα και την ωρα, το '15/1/2005' θα αποθηκευτει σαν '15/1/2005 00:00:00'.

με φορματ 'dd/mm/yyyy HH24:MI:SS' = δινεις και την ωρα ως '15/1/2005 13:01:22'

 

στη θεση του 'dd/mm/yyyy' βάλε ενα φορματ αναλογα τι θες να παρεις/δώσεις. και οι τα διαχωριστικά (κάθετοι "/", ":" ) ειναι επιλογή σου. μπορεις να βαλεις spaces, τελειες, παυλες, klp

το YY kai MM φυσικα δέχονται και διψηφια και μονοψήφια.

 

για το έτος υπαρχει και το DD/MM/RRRR που δέχεται και το 1/1/05, και το 1/1/2005 σαν σωστό input.

ψαξε το "Date Format Elements" εδω http://www.csee.umbc.edu/help/oracle8/server.815/a67779/ch2.htm#34512

 

------------------------------------

 

Επειδη, λες οτι με χειροκινητο insert βαζεις '20-04-2005' και το δεχεται. μαλλον ειναι το δηλωμενο default format στη βαση σου.

δηλ, αν δινεις

INSERT INTO T (dz) VALUES ('15-1-2005');

και σου το δεχεται χωρις μετατροπή, σημαινει οτι εχεις βαση με initialization parameter NLS_DATE_FORMAT ='dd-mm-yyyy'.

στη δικη μου βάση δεχετε το '15-JAN-05' χωρις μετατροπή, αλλα οχι το δικό σου.

Δεν πρεπει να στηριζεσαι σε αυτο. Αν μεταφερεις την εφαρμογη σε άλλη βαση ή την ξαναστήσεις, με διαφορετικο default, δεν θα παίζει.

καλυτερο ειναι να κανεις πάντα τη μετατροπη TO_DATE.

Δημοσ.

joss, τώρα με μπέρδεψες.

πες μας σε παρακαλώ,

1. τι ακριβώς θες να κάνεις

2. τι έχεις σαν δεδομένα

Δημοσ.

Cue δεν υπάρχει πρόβλημα, τελικά μπόρεσα να το λύσω με αυτό που πρότεινε ο random

Ευχαριστώ πολύ που με βοηθήσατε...

Δημοσ.

καλώς, αν και η λύση:

θα εκανα τα πάντα στη java με strings' date=' και θα αφηνα την oracle, να μετατρέπει σε/απο date sta select/insert αντίστοιχα.

[/quote']

 

είναι λίγο ανορθόδοξη. :)

Φιλική συμβουλή, καλό θα ήταν να ξεκαθαρίσεις τα πράγματα με τα dates στην Java. Θέλουν λίγο ψάξιμο στην αρχή αλλά όταν τα μάθεις θα δεις ό,τι δεν είναι κάτι δύσκολο. :)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...