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

Formateringsdato for Postgresql

Det lyder som om du sender argumentet ved at sammenkæde dem direkte i strengen. Dette er en meget dårlig idé, da det kan føre til SQL-injektioner. Brug altid PreparedStatement s med ? pladsholdere til at videregive parametre, send dem aldrig direkte ved at sammenkæde dem direkte i forespørgselsstrengen (mere så skal du bruge ' afgrænsninger omkring).

Du kunne have noget 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 er PostgreSQL intern datokonvertering normalt ret god og fleksibel. Du kan caste strengparameteren til en dato med PostgreSQL:

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

Dette er fleksibelt, men fører muligvis ikke til det nøjagtige resultat, du har brug for, afhængigt af datoformatet (du kan tjekke PostgreSQL-manualen for detaljer om datokonverteringsformater). Det inputformat, du bruger, burde dog fungere fint (Prøv SELECT CAST('2012-05-01' AS DATE) direkte i PostgreSQL, for eksempel, vil dette returnere en korrekt PostgreSQL-dato.)

Bemærk, at når du bruger new java.sql.Date(cin.getTime()) , vil du sandsynligvis løbe ind i tidszoneproblemer. Du kan bruge java.sql.Date.valueOf(...) også.

For at præcisere, følg din redigering:

Dette vil ikke virke, da datoerne ville være en del af selve SQL-syntaksen, ikke strenge eller datoer:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Du skal i det mindste bruge ' citater:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Her kunne du til en vis grad forvente, at parametrene er formateret korrekt, men lad være med at gøre det. Derudover ville stadig skulle caste strengen ved hjælp af CAST('...' AS DATE) eller '...'::DATE .

Den enkleste måde ville helt sikkert være:

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åpegede i en kommentar, ville den generelle forespørgsel alligevel ikke fungere på grund af dit indre valg.)



  1. Mysql Query ydeevne. Hvilken er bedst?

  2. sql-server viser manglende datoer

  3. Forskellen mellem -> og ::i PHP MySQLi OOP

  4. JUser::_load:Kan ikke indlæse bruger, selvom brugeren findes i alle 3 hovedjoomla-tabeller