sql >> Databáze >  >> RDS >> PostgreSQL

Datum formátování pro Postgresql

Zní to, jako byste argument předali jejich zřetězením přímo do řetězce. To je velmi špatný nápad, protože to může vést k injekcím SQL. Vždy použijte PreparedStatement s pomocí ? zástupné symboly pro předávání parametrů, nikdy je nepředávejte přímo jejich zřetězením přímo do řetězce dotazu (více, budete potřebovat ' oddělovače kolem).

Můžete mít něco jako:

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

Případně je převod interního data PostgreSQL obvykle docela dobrý a flexibilní. Parametr řetězce můžete přetypovat na datum pomocí PostgreSQL:

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

To je flexibilní, ale nemusí vést k přesnému výsledku, který potřebujete v závislosti na formátu data (podrobnosti o formátech převodu data naleznete v příručce PostgreSQL). Vstupní formát, který používáte, by však měl fungovat dobře (Zkuste SELECT CAST('2012-05-01' AS DATE) přímo v PostgreSQL, například to vrátí správné datum PostgreSQL.)

Pamatujte, že při použití new java.sql.Date(cin.getTime()) , pravděpodobně narazíte na problémy s časovým pásmem. Můžete použít java.sql.Date.valueOf(...) taky.

Pro upřesnění postupujte podle vaší úpravy:

Toto nebude fungovat, protože data by byla součástí samotné syntaxe SQL, nikoli řetězce nebo data:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Museli byste alespoň použít ' citáty:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Zde byste do určité míry mohli očekávat, že parametry budou správně naformátovány, ale nedělejte to. Navíc by stále musel přetypovat řetězec pomocí CAST('...' AS DATE) nebo '...'::DATE .

Nejjednodušší způsob by jistě byl:

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

(Jak a_horse_with_no_name zdůraznil v komentáři, obecný dotaz by stejně nefungoval kvůli vašemu vnitřnímu výběru.)



  1. Obnova databáze MySQL z fyzických souborů

  2. Microsoft SQL DB na MySQL DB

  3. Jak provést synchronizaci s místní databází a analyzovat?

  4. Datový typ Oracle JDBC a Oracle CHAR