1

ResultSetを処理するこのJavaメソッドがあります。

protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames) throws SQLException {
    for (int i = 0; i < rowSet.length; i++) {
        rowSet[i] = rs.getString(columunsNames[i]);
    }
}

ご覧のとおり、すべての結果は文字列型として扱われます(getStringは列型に関係なく使用されます)。日付列が検出されると、自動的に文字列に変換されます。結果の日付は次のように表示されます。

2012-08-01 16:10:47.0

上記のスクリプトを変更して、次のようなものを作成しました。

protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames) throws SQLException {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    for (int i = 0; i < rowSet.length; i++) {
        Object o = rs.getObject(columunsNames[i]);
        if (o instanceof Date) {
            rowSet[i] = formatter.format((Date)o);
        } else {
            rowSet[i] = (String)o;
        }   
    }
}

このメソッドはすべてをオブジェクトとして扱い、その後、そのオブジェクトがDateのインスタンスであるかどうかをチェックします。これが当てはまる場合は、に従ってフォーマットされformatterます。問題は、このようにして返されるデータが次のようになることです。

2012-08-01 00:00:00.0

なんで?

更新1-最後に機能するメソッドの実装:

protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames, SimpleDateFormat formatter) throws SQLException {
    Timestamp ts = null;
    for (int i = 0; i < rowSet.length; i++) {
        Object obj = rs.getObject(columunsNames[i]);
        if (obj instanceof Date) {
            ts = rs.getTimestamp(columunsNames[i]);
            rowSet[i] = formatter.format(ts);
        } else {
            if(obj!=null)
                rowSet[i] = obj+"";
            else
                rowSet[i] = "";
        }       
    }
}
4

2 に答える 2

4

java.sql.Date時間に関する情報は保存されません:

SQL DATEの定義に準拠するには、java.sql.Dateインスタンスによってラップされるミリ秒値を、インスタンスが関連付けられている特定のタイムゾーンで時間、分、秒、およびミリ秒をゼロに設定することによって「正規化」する必要があります。 。

于 2012-11-20T12:15:09.767 に答える
2

このメソッドはすべてをオブジェクトとして扱い、その後、そのオブジェクトがDateのインスタンスであるかどうかをチェックします。

dateを使用する代わりにjava.sql.Timestamp、これを使用すると、データを永続化するかデータをフェッチするかのいずれかで、日付と時刻を取得できます。

アップデート1

あなたは次のような一般的な方法を持つことができます

public Timestamp getTimestamp(int columnIndex) throws SQLException {
    Object value = getObject(columnIndex);
    if (value instanceof Timestamp) return (Timestamp) value;

  }

これにより日付と時刻が返され、列インデックスを渡すことで呼び出すことができます。

于 2012-11-20T12:21:48.927 に答える