sql >> Databasteknik >  >> RDS >> PostgreSQL

Formateringsdatum för Postgresql

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:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . 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 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.)



  1. Analysera SQL-fil med PL/SQL och DML/DDL med cx_Oracle i python

  2. Hur kontrollerar jag SQL-replikeringsstatus via T-SQL?

  3. Hur man kontrollerar händelseschemaläggarens status mysql

  4. Installera SQL Server Failover Cluster Instance – Del 1