2009-08-14 15 views
1

私はこのJDBC SQLクエリを持っている:JDBC:Oracleでどのように時間をクエリできますか?

select * 
from table 
where TX_DATE = {d '2009-01-05'} and TX_TIME = {t '15:23:39'} 

これは、いくつかの行を返します。 OracleにはTIME型がないため、両方の列の型がDATEであることに注意してください。

しかし、私はJDBCパラメータを使用する場合、それは失敗します。

最初のパラメータは new java.sql.Date(...)であり、第二は new java.sql.Time(...)ある
select * 
from table 
where TX_DATE = ? and TX_TIME = ? 

。私はstdoutに両方のパラメータを表示し、それらはよく見えるので、値は正しいです。しかし、私は行を取得しません。どうして? {t '15:23:39'}new java.sql.Time()の違いは何ですか?

public static void setParameters (final PreparedStatement stmt, 
     final Object... param) 
{ 
    for (int i=0; i<param.length; i++) 
    { 
     Object debug = param[i]; 
     String type = null; 

     if (param[i] == null) 
      stmt.setString(i+1, null); 
     else if (param[i] instanceof java.sql.Time) 
      stmt.setTime (i+1, (java.sql.Time)param[i]); 

私はsetTime()にブレークポイントを設定したし、それが呼び出される:

[EDIT]ここPreparedStatementを埋めるコードがあります。 param[1].toString()15:23:39を出力するので、値が正しいことがわかります。

私は、OracleにはTIMEタイプがないため、ドライバにバグがあり、時刻のDATE部分は無視されないと考えられます。

私はテーブル全体にselect *を使用している場合は、私はあなたが見えることができますように、時間の欄には、デフォルトでは、日付のように扱われ

TX_DATE  TX_TIME 
2009-01-08 2009-08-01 

得ます。私はTO_CHAR(TX_TIME, 'HH24:MI:SS')を使用している場合は、私が手:

TX_DATE  TX_TIME 
2009-01-08 15:23:39 

2009-08-01はどこから来るのでしょうか?

答えて

3

Oracleには時間のJava型はありません。 java.sql.Timeクラスは、最新のドライバであってもoracle.sql.DATEクラスにマップされます。 Documentation Hereあなたがすべきことは、TX_TIMEの「日」部分が何らかの標準値(例えば、1970-01-01)であることです。次に、静的な「日」を使用してこの列を照会して、時間が期待どおりに機能するようにすることができます。

使用しているOracleドライバのバージョンによって、Oracle DATE列型のjava.sql.Dateおよびjava.sql.Timestampの処理が異なります。詳細はJDBC FAQをご確認ください。がんばろう!

public static void setParameters (final PreparedStatement stmt, 
    final Object... param) 
{ 
    for (int i=0; i<param.length; i++) 
    { 
     Object debug = param[i]; 
     String type = null; 

     if (param[i] == null) 
     stmt.setString(i+1, null); 
     else if (param[i] instanceof java.sql.Time) 
     { 
     stmt.setTime (
      i+1, 
      java.sql.Timestamp.valueof("1970-01-01 " + param[i] + ".000000000") 
     ); 
     } 
+0

ありがとうございます。私は何とか「今日の1月」の代わりに1つを指定しなければ、同じ「日」の部分を使用することを期待していました。 –

0

これはPreparedStatementを使用しているとしますか?

PrepapredStatement stmt = conn.prepareStatement(
       "select * from table where TX_DATE = ? and TX_TIME = ?") 
stmt.setDate(1, new java.sql.Date(myDate.getTime)); 
stmt.setTimestamp(2, new java.sql.Timestamp(myDate.getTime)); 

ResultSet rs = stmt.executeQuery(); 
+0

私が書いたように、私はjava.sql.Timestampではなくjava.sql.Timeを使用しています。 –

+0

私はSimpleDateFormat.parse()で "HH:mm:ss"という形式で値を "15:23:39"で初期化しています。 –

+0

yuour *実際のコード*を転記できますか?私が見ることができないコードをデバッグするのは難しいです!あなたは 'PreparedStatement'を使って、私が言ったように(時間はありますが)パラメータを設定していますか?代わりにタイムスタンプを使用しようとしましたか、それとも有効かどうかを確認するために日付ビットを使用しましたか? –

関連する問題