PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Data di formattazione per Postgresql

Sembra che tu stia passando l'argomento concatenandoli direttamente nella stringa. Questa è una pessima idea, poiché può portare a iniezioni SQL. usa PreparedStatement s con il ? segnaposto per passare parametri, non passarli mai direttamente concatenandoli direttamente nella stringa di query (inoltre, avresti bisogno del ' delimitatori intorno).

Potresti avere qualcosa come:

 PreparedStatement stmt
     = con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=?")
 stmt.setDate(1, new java.sql.Date(cin.getTime()));
      // ? parameters are indexed from 1
 ResultSet results = stmt.executeQuery();

In alternativa, la conversione interna della data di PostgreSQL è generalmente abbastanza buona e flessibile. Puoi eseguire il cast del parametro string a una data con PostgreSQL:

 PreparedStatement stmt
     = con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
 stmt.setString(1, cinDate);
 ResultSet results = stmt.executeQuery();

Questo è flessibile, ma potrebbe non portare al risultato esatto di cui hai bisogno a seconda del formato della data (puoi controllare il manuale di PostgreSQL per i dettagli sui formati di conversione della data). Tuttavia, il formato di input che stai utilizzando dovrebbe funzionare correttamente (prova SELECT CAST('2012-05-01' AS DATE) direttamente in PostgreSQL, ad esempio, questo restituirà una data PostgreSQL corretta.)

Nota che quando usi new java.sql.Date(cin.getTime()) , è probabile che si verifichino problemi di fuso orario. Potresti usare java.sql.Date.valueOf(...) anche.

Per chiarire, a seguito della tua modifica:

Questo non funzionerà, poiché le date sarebbero parte della sintassi SQL stessa, non stringhe o date:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Dovresti almeno usare ' virgolette:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Qui, in una certa misura, potresti aspettarti che i parametri siano formattati correttamente, ma non farlo. Inoltre, dovrebbe comunque eseguire il cast della stringa utilizzando CAST('...' AS DATE) o '...'::DATE .

Il modo più semplice sarebbe sicuramente:

String searchQuery = "SELECT * FROM Rooms r where r.id not in (select SOMETHING from search(CAST(? AS DATE), CAST(? AS DATE)))";
PreparedStatement ps = conn.prepareStatement(searchQuery);
ps.setString(1, cinDate);
ps.setString(2, coutDate);

(Come sottolineato in un commento a_horse_with_no_name, la query generale non funzionerebbe comunque a causa della tua selezione interiore.)