PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Ngày định dạng cho Postgresql

Có vẻ như bạn đang truyền đối số bằng cách nối chúng trực tiếp vào chuỗi. Đây là một ý tưởng rất tồi, vì nó có thể dẫn đến việc tiêm SQL. Luôn sử dụng PreparedStatement s với ? trình giữ chỗ để chuyển các tham số, không bao giờ chuyển trực tiếp chúng bằng cách nối chúng trực tiếp vào chuỗi truy vấn (hơn thế nữa, bạn cần ' dấu phân cách xung quanh).

Bạn có thể có một cái gì đó như:

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

Ngoài ra, chuyển đổi ngày nội bộ PostgreSQL thường khá tốt và linh hoạt. Bạn có thể truyền tham số chuỗi thành một ngày với PostgreSQL:

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

Điều này linh hoạt, nhưng có thể không dẫn đến kết quả chính xác mà bạn cần tùy thuộc vào định dạng ngày (bạn có thể kiểm tra hướng dẫn sử dụng PostgreSQL để biết chi tiết về các định dạng chuyển đổi ngày). Tuy nhiên, định dạng đầu vào bạn đang sử dụng sẽ hoạt động tốt (Hãy thử SELECT CAST('2012-05-01' AS DATE) trực tiếp trong PostgreSQL, chẳng hạn, điều này sẽ trả về một ngày PostgreSQL chính xác.)

Lưu ý rằng khi sử dụng new java.sql.Date(cin.getTime()) , bạn có thể gặp phải các vấn đề về múi giờ. Bạn có thể sử dụng java.sql.Date.valueOf(...) quá.

Để làm rõ, hãy theo dõi chỉnh sửa của bạn:

Điều này sẽ không hoạt động, vì ngày tháng sẽ là một phần của chính cú pháp SQL, không phải chuỗi hoặc ngày:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Ít nhất bạn cần sử dụng ' dấu ngoặc kép: "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Ở một mức độ nào đó, bạn có thể mong đợi các tham số được định dạng đúng cách, nhưng đừng làm như vậy. Ngoài ra, sẽ vẫn phải truyền chuỗi bằng cách sử dụng CAST('...' AS DATE) hoặc '...'::DATE .

Cách đơn giản nhất chắc chắn sẽ là:

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

(Như a_horse_with_no_name đã chỉ ra trong một nhận xét, truy vấn chung sẽ không hoạt động do lựa chọn bên trong của bạn.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn một mảng bằng cách sử dụng Sequel gem trong PostgreSQL

  2. Nhận tất cả các khóa ngoại bằng JDBC

  3. Cách kiểm tra các hoạt động đang chờ xử lý trong một giao dịch PostgreSQL

  4. Chuyển dữ liệu giữa các cơ sở dữ liệu với PostgreSQL

  5. psql:FATAL:vai trò postgres không tồn tại