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. Javaから渡された特定のソート順でソートするようにOracleに指示するにはどうすればよいですか?

    2. Djangoインポート-エクスポートインポート重複キー値がエラーに違反しています

    3. USER()とSYS_CONTEXT('USERENV'、'CURRENT_USER')の違いは何ですか?

    4. トリガー関数でOLD、NEW、および識別子をEXECUTEに渡す方法は?