sql >> Base de Datos >  >> RDS >> PostgreSQL

Fecha de formato para Postgresql

Parece que estás pasando el argumento concatenándolos directamente en la cadena. Esta es una muy mala idea, ya que puede conducir a inyecciones de SQL. Siempre use PreparedStatement s con el ? marcadores de posición para pasar parámetros, nunca los pase directamente concatenándolos directamente en la cadena de consulta (más aún, necesitaría el ' delimitadores alrededor).

Podrías tener algo como:

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

Alternativamente, la conversión de fecha interna de PostgreSQL suele ser bastante buena y flexible. Podría convertir el parámetro de cadena a una fecha con PostgreSQL:

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

Esto es flexible, pero es posible que no conduzca al resultado exacto que necesita según el formato de fecha (puede consultar el manual de PostgreSQL para obtener detalles sobre los formatos de conversión de fecha). Sin embargo, el formato de entrada que está utilizando debería funcionar bien (Pruebe SELECT CAST('2012-05-01' AS DATE) directamente en PostgreSQL, por ejemplo, esto devolverá una fecha correcta de PostgreSQL).

Tenga en cuenta que al usar new java.sql.Date(cin.getTime()) , es probable que tenga problemas con la zona horaria. Podrías usar java.sql.Date.valueOf(...) también.

Para aclarar, después de su edición:

Esto no funcionará, ya que las fechas serían parte de la sintaxis SQL en sí, no cadenas ni fechas:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Al menos necesitarías usar ' comillas:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Aquí, hasta cierto punto, podría esperar que los parámetros tengan el formato adecuado, pero no lo haga. Además, aún tendría que emitir la cadena usando CAST('...' AS DATE) o '...'::DATE .

La forma más sencilla sería sin duda:

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

(Como a_horse_with_no_name señaló en un comentario, la consulta general no funcionaría de todos modos debido a su selección interna).