PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tanggal Pemformatan untuk Postgresql

Sepertinya Anda meneruskan argumen dengan menggabungkannya langsung ke dalam string. Ini adalah ide yang sangat buruk, karena dapat menyebabkan injeksi SQL. Selalu gunakan PreparedStatement s dengan ? place-holder untuk meneruskan parameter, jangan pernah meneruskannya secara langsung dengan menggabungkannya langsung ke string kueri (lebih dari itu, Anda memerlukan ' pembatas di sekitar).

Anda dapat memiliki sesuatu seperti:

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

Atau, konversi tanggal internal PostgreSQL biasanya cukup baik dan fleksibel. Anda dapat memberikan parameter string ke tanggal dengan PostgreSQL:

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

Ini fleksibel, tetapi mungkin tidak mengarah ke hasil yang tepat yang Anda butuhkan tergantung pada format tanggal (Anda dapat memeriksa manual PostgreSQL untuk detail tentang format konversi tanggal). Format input yang Anda gunakan seharusnya berfungsi dengan baik (Coba SELECT CAST('2012-05-01' AS DATE) langsung di PostgreSQL, misalnya, ini akan mengembalikan tanggal PostgreSQL yang benar.)

Perhatikan bahwa saat menggunakan new java.sql.Date(cin.getTime()) , Anda mungkin mengalami masalah zona waktu. Anda dapat menggunakan java.sql.Date.valueOf(...) juga.

Untuk memperjelas, ikuti hasil edit Anda:

Ini tidak akan berfungsi, karena tanggal akan menjadi bagian dari sintaks SQL itu sendiri, bukan string atau tanggal:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

Anda setidaknya harus menggunakan ' kutipan:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . Di sini, sampai taraf tertentu, Anda dapat mengharapkan parameter diformat dengan benar, tetapi jangan lakukan itu. Selain itu, masih harus melemparkan string menggunakan CAST('...' AS DATE) atau '...'::DATE .

Cara paling sederhana tentu saja:

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

(Seperti yang ditunjukkan a_horse_with_no_name dalam komentar, kueri umum tetap tidak akan berfungsi karena pilihan batin Anda.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menginstal libpq-fe.h?

  2. Kurangi Hari dari Tanggal di PostgreSQL

  3. Hitung hari kerja terdekat di Postgres

  4. Apakah baris dikunci secara berurutan dalam pernyataan SELECT ... ORDER BY ... FOR UPDATE?

  5. Ubah tipe data kolom menjadi serial