Det låter som att du förmedlar argumentet genom att sammanfoga dem direkt i strängen. Detta är en mycket dålig idé, eftersom det kan leda till SQL-injektioner. Använd alltid PreparedStatement
s
med ?
platshållare för att skicka parametrar, skicka dem aldrig direkt genom att sammanfoga dem direkt i frågesträngen (mer så skulle du behöva '
avgränsare runt).
Du kan ha något som:
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();
Alternativt är PostgreSQL intern datumkonvertering vanligtvis ganska bra och flexibel. Du kan casta strängparametern till ett datum med PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Detta är flexibelt, men leder kanske inte till det exakta resultatet du behöver beroende på datumformatet (du kan kontrollera PostgreSQL-manualen för detaljer om datumkonverteringsformat). Inmatningsformatet du använder bör dock fungera bra (försök med SELECT CAST('2012-05-01' AS DATE)
direkt i PostgreSQL, till exempel, kommer detta att returnera ett korrekt PostgreSQL-datum.)
Observera att när du använder new java.sql.Date(cin.getTime())
, kommer du sannolikt att stöta på tidszonsproblem. Du kan använda java.sql.Date.valueOf(...)
också.
För att förtydliga, följ din redigering:
Detta kommer inte att fungera, eftersom datumen skulle vara en del av själva SQL-syntaxen, inte strängar eller datum:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Du måste åtminstone använda '
citat: . Här kan du till viss del förvänta dig att parametrarna är korrekt formaterade, men gör det inte. Dessutom skulle fortfarande behöva casta strängen med "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
eller '...'::DATE
.
Det enklaste sättet skulle säkert vara:
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);
(Som a_horse_with_no_name påpekade i en kommentar, skulle den allmänna frågan inte fungera ändå på grund av ditt inre val.)