PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Дата на форматиране за Postgresql

Звучи сякаш предавате аргумента, като ги свързвате директно в низа. Това е много лоша идея, тъй като може да доведе до SQL инжекции. Винаги използвайте PreparedStatement s с ? заместители за предаване на параметри, никога не ги предавайте директно, като ги свържете директно в низа на заявката (още повече, ще ви трябва ' разделители наоколо).

Може да имате нещо като:

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

Като алтернатива, вътрешното преобразуване на дата на PostgreSQL обикновено е доста добро и гъвкаво. Можете да прехвърлите низовия параметър към дата с PostgreSQL:

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

Това е гъвкаво, но може да не доведе до точния резултат, от който се нуждаете в зависимост от формата на датата (можете да проверите ръководството на PostgreSQL за подробности относно форматите за преобразуване на датата). Форматът на въвеждане, който използвате, обаче трябва да работи добре (опитайте SELECT CAST('2012-05-01' AS DATE) директно в PostgreSQL, например, това ще върне правилна дата на PostgreSQL.)

Имайте предвид, че когато използвате new java.sql.Date(cin.getTime()) , вероятно ще се натъкнете на проблеми с часовата зона. Можете да използвате java.sql.Date.valueOf(...) също.

За пояснение, следвайки вашата редакция:

Това няма да работи, тъй като датите ще бъдат част от самия SQL синтаксис, а не низове или дати:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Трябва поне да използвате ' кавички:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Тук до известна степен можете да очаквате параметрите да бъдат форматирани правилно, но не го правете. В допълнение, все още ще трябва да прехвърляте низа с помощта на CAST('...' AS DATE) или '...'::DATE .

Най-простият начин със сигурност би бил:

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

(Както a_horse_with_no_name посочи в коментар, общата заявка така или иначе няма да работи поради вашия вътрешен избор.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:SQL скрипт за получаване на списък на всички таблици, които имат определена колона като външен ключ

  2. Как да изтрия дублиращи се записи?

  3. Postgresql - откриване на промени и извикване на уеб услуга

  4. Мигрирайте MS Access към PostgreSQL

  5. Вземете серийна стойност по подразбиране след INSERT в PL/pgSQL