PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Formatage de la date pour Postgresql

Il semble que vous passiez l'argument en les concaténant directement dans la chaîne. C'est une très mauvaise idée, car cela peut conduire à des injections SQL. Toujours utiliser PreparedStatement s avec le ? espaces réservés pour passer des paramètres, ne les transmettez jamais directement en les concaténant directement dans la chaîne de requête (plus encore, vous auriez besoin du ' délimiteurs autour).

Vous pourriez avoir quelque chose comme :

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

Alternativement, la conversion de date interne PostgreSQL est généralement assez bonne et flexible. Vous pouvez convertir le paramètre de chaîne en une date avec PostgreSQL :

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

Ceci est flexible, mais peut ne pas conduire au résultat exact dont vous avez besoin en fonction du format de date (vous pouvez consulter le manuel PostgreSQL pour plus de détails sur les formats de conversion de date). Le format d'entrée que vous utilisez devrait cependant fonctionner correctement (Essayez SELECT CAST('2012-05-01' AS DATE) directement dans PostgreSQL, par exemple, cela renverra une date PostgreSQL correcte.)

Notez que lors de l'utilisation de new java.sql.Date(cin.getTime()) , vous risquez de rencontrer des problèmes de fuseau horaire. Vous pouvez utiliser java.sql.Date.valueOf(...) aussi.

Pour clarifier, suite à votre modification :

Cela ne fonctionnera pas, car les dates feraient partie de la syntaxe SQL elle-même, et non des chaînes ou des dates :"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Vous auriez au moins besoin d'utiliser ' guillemets :"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Ici, dans une certaine mesure, vous pouvez vous attendre à ce que les paramètres soient formatés correctement, mais ne le faites pas. De plus, il faudrait toujours convertir la chaîne en utilisant CAST('...' AS DATE) ou '...'::DATE .

Le moyen le plus simple serait certainement :

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

(Comme a_horse_with_no_name l'a souligné dans un commentaire, la requête générale ne fonctionnerait pas de toute façon à cause de votre sélection interne.)