PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Formatowanie daty dla Postgresql

Wygląda na to, że przekazujesz argument, łącząc go bezpośrednio w łańcuchu. To bardzo zły pomysł, ponieważ może prowadzić do wstrzyknięć SQL. Zawsze używaj PreparedStatement s z ? symbole zastępcze do przekazywania parametrów, nigdy nie przekazuj ich bezpośrednio, łącząc je bezpośrednio w ciągu zapytania (co więcej, potrzebujesz ' ograniczniki wokół).

Możesz mieć coś takiego:

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

Alternatywnie, wewnętrzna konwersja danych PostgreSQL jest zwykle dość dobra i elastyczna. Możesz rzutować parametr ciągu na datę za pomocą PostgreSQL:

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

Jest to elastyczne, ale może nie prowadzić do dokładnego wyniku, którego potrzebujesz, w zależności od formatu daty (możesz sprawdzić podręcznik PostgreSQL, aby uzyskać szczegółowe informacje na temat formatów konwersji dat). Format wejściowy, którego używasz, powinien działać poprawnie (Spróbuj SELECT CAST('2012-05-01' AS DATE) na przykład bezpośrednio w PostgreSQL zwróci poprawną datę PostgreSQL.)

Zauważ, że używając new java.sql.Date(cin.getTime()) , prawdopodobnie napotkasz problemy ze strefą czasową. Możesz użyć java.sql.Date.valueOf(...) też.

Aby wyjaśnić, po swojej edycji:

To nie zadziała, ponieważ daty byłyby częścią samej składni SQL, a nie ciągami lub datami:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Musisz przynajmniej użyć ' cytaty:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Tutaj, do pewnego stopnia, możesz oczekiwać, że parametry będą poprawnie sformatowane, ale nie rób tego. Ponadto nadal musiałby rzutować ciąg za pomocą CAST('...' AS DATE) lub '...'::DATE .

Najprostszym sposobem z pewnością byłoby:

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 zauważył a_koń_bez_nazwy w komentarzu, ogólne zapytanie i tak nie zadziałałoby z powodu twojego wewnętrznego wyboru).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2:Zaktualizuj wiele wierszy w tabeli wartościami z krotki

  2. Jak używać klasy pqxx::stateless_cursor z libpqxx?

  3. Rails ActiveRecord - jak pobrać rekordy między dwiema datami

  4. Jak obliczyć wykładniczą średnią kroczącą na postgresie?

  5. Jaka jest maksymalna wielkość partii JDBC?