PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Data de formatação para Postgresql


Parece que você está passando o argumento concatenando-os diretamente na string. Esta é uma ideia muito ruim, pois pode levar a injeções de SQL. Sempre use PreparedStatement s com o ? espaços reservados para passar parâmetros, nunca os passe diretamente concatenando-os diretamente na string de consulta (mais ainda, você precisaria do ' delimitadores ao redor).

Você poderia ter 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, a conversão de data interna do PostgreSQL geralmente é bastante boa e flexível. Você pode converter o parâmetro string para uma data com o PostgreSQL:
 PreparedStatement stmt
     = con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
 stmt.setString(1, cinDate);
 ResultSet results = stmt.executeQuery();

Isso é flexível, mas pode não levar ao resultado exato que você precisa dependendo do formato de data (você pode verificar o manual do PostgreSQL para obter detalhes sobre os formatos de conversão de data). O formato de entrada que você está usando deve funcionar bem (tente SELECT CAST('2012-05-01' AS DATE) diretamente no PostgreSQL, por exemplo, isso retornará uma data correta do PostgreSQL.)

Observe que ao usar new java.sql.Date(cin.getTime()) , é provável que você tenha problemas de fuso horário. Você pode usar java.sql.Date.valueOf(...) também.

Para esclarecer, seguindo sua edição:

Isso não funcionará, pois as datas fariam parte da própria sintaxe SQL, não strings ou datas:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Você precisaria pelo menos usar ' aspas:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Aqui, até certo ponto, você poderia esperar que os parâmetros fossem formatados corretamente, mas não faça isso. Além disso, ainda teria que converter a string usando CAST('...' AS DATE) ou '...'::DATE .

A maneira mais simples certamente seria:
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 apontou em um comentário, a consulta geral não funcionaria de qualquer maneira por causa de sua seleção interna.)