sql >> Database >  >> RDS >> PostgreSQL

Datum opmaken voor Postgresql

Het klinkt alsof je het argument doorgeeft door ze rechtstreeks in de string samen te voegen. Dit is een heel slecht idee, omdat het kan leiden tot SQL-injecties. Altijd gebruik PreparedStatement s met de ? plaatsaanduidingen om parameters door te geven, geef ze nooit rechtstreeks door ze rechtstreeks in de queryreeks samen te voegen (meer nog, u hebt de ' nodig scheidingstekens rond).

Je zou zoiets kunnen hebben als:

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

Als alternatief is de interne datumconversie van PostgreSQL meestal redelijk goed en flexibel. Je zou de stringparameter naar een datum kunnen casten met PostgreSQL:

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

Dit is flexibel, maar leidt mogelijk niet tot het exacte resultaat dat u nodig hebt, afhankelijk van het datumformaat (u kunt de PostgreSQL-handleiding raadplegen voor details over datumconversieformaten). Het invoerformaat dat u gebruikt, zou echter prima moeten werken (Probeer SELECT CAST('2012-05-01' AS DATE) rechtstreeks in PostgreSQL, bijvoorbeeld, dit geeft een correcte PostgreSQL-datum terug.)

Merk op dat bij gebruik van new java.sql.Date(cin.getTime()) , loop je waarschijnlijk tegen problemen met de tijdzone aan. Je zou java.sql.Date.valueOf(...) . kunnen gebruiken ook.

Ter verduidelijking, na uw bewerking:

Dit zal niet werken, omdat de datums deel zouden uitmaken van de SQL-syntaxis zelf, niet strings of datums:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

U moet op zijn minst ' . gebruiken quotes:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Hier zou je tot op zekere hoogte kunnen verwachten dat de parameters correct zijn geformatteerd, maar doe het niet. Bovendien zou de string nog steeds moeten worden gecast met CAST('...' AS DATE) of '...'::DATE .

De eenvoudigste manier zou zeker zijn:

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

(Zoals a_horse_with_no_name in een opmerking opmerkte, zou de algemene vraag toch niet werken vanwege je innerlijke selectiviteit.)



  1. NodeJS, sluit mysql-verbinding niet

  2. Database-ontwerp

  3. Hoe afbeeldingen op te slaan in een varbinary(max) kolom?

  4. Dynamische SQL om kolomnamen te genereren?