PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Formatierungsdatum für Postgresql

Es hört sich so an, als würden Sie das Argument übergeben, indem Sie es direkt in die Zeichenfolge verketten. Dies ist eine sehr schlechte Idee, da es zu SQL-Injections führen kann. Verwenden Sie immer PreparedStatement s mit dem ? Platzhalter zum Übergeben von Parametern, übergeben Sie sie niemals direkt, indem Sie sie direkt in die Abfragezeichenfolge verketten (mehr noch, Sie benötigen den ' Trennzeichen herum).

Sie könnten so etwas haben wie:

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

Alternativ ist die interne PostgreSQL-Datumsumwandlung normalerweise ziemlich gut und flexibel. Sie könnten den String-Parameter mit PostgreSQL in ein Datum umwandeln:

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

Dies ist flexibel, führt aber je nach Datumsformat möglicherweise nicht zu dem genauen Ergebnis, das Sie benötigen (Einzelheiten zu Datumskonvertierungsformaten finden Sie im PostgreSQL-Handbuch). Das von Ihnen verwendete Eingabeformat sollte jedoch problemlos funktionieren (versuchen Sie es mit SELECT CAST('2012-05-01' AS DATE) direkt in PostgreSQL, wird dies beispielsweise ein korrektes PostgreSQL-Datum zurückgeben.)

Beachten Sie dies bei Verwendung von new java.sql.Date(cin.getTime()) , treten wahrscheinlich Zeitzonenprobleme auf. Sie könnten java.sql.Date.valueOf(...) verwenden auch.

Zur Verdeutlichung nach Ihrer Bearbeitung:

Dies wird nicht funktionieren, da die Daten Teil der SQL-Syntax selbst wären, keine Zeichenfolgen oder Daten:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Sie müssten mindestens ' verwenden Anführungszeichen:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Hier könnten Sie bis zu einem gewissen Grad erwarten, dass die Parameter richtig formatiert sind, aber tun Sie es nicht. Außerdem müsste der String noch mit CAST('...' AS DATE) gecastet werden oder '...'::DATE .

Der einfachste Weg wäre sicherlich:

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

(Wie a_horse_with_no_name in einem Kommentar anmerkte, würde die allgemeine Abfrage aufgrund Ihrer inneren Auswahl sowieso nicht funktionieren.)