2

次の属性を持つAbbonamentoというテーブルがあります。

Abbonamento(idAbbonamento, tipo, DataInizio, DataScadenza, ....)

DataInizioとDataScadenzaはタイプDATEです。このテーブルで選択を行うと、問題が発生します。

        String queryAbb = "select idabbonamento, tipo, DATE_FORMAT(datainizio,'%d-%m-%Y'), DATE_FORMAT(datascadenza,'%d-%m-%Y'), ...;
                       prest = con.prepareStatement(queryAbb);
        rs = prest.executeQuery();
        while (rs.next()) {
            a=new Abbonamento();
            a.setIdAbbonamento(rs.getInt(1));
            a.setTipo(rs.getString(2));
            a.setDataInizio(rs.getDate(3));
            System.out.println(rs.getDate(3)); 
            a.setDataScadenza(rs.getDate(4));
            ...
        }

ここで、たとえばデータベース内の日付DataInizioが必要2013-11-05 00:00:00な場合05-11-2013、printlnはを出力し0004-10-13ます。

上記のコードの何が問題になっていますか?

4

3 に答える 3

1

それ以外の

rs.getDate(3)

あなたが使用する必要があります

rs.getString(3)

データはすでに文字列としてフォーマットされているためです。として取得したい場合はDate、最初に、文字列からDateオブジェクトが作成され05-11-2013、次にそれを受け取ります。

Dateオブジェクトにオブジェクトがある場合は、DBから返されたのと同じ形式のparse()文字列を返すか、フォーマットせずにJDBCに変換を実行させる必要があります(この場合は単純に)。select idabbonamento, tipo, datainizio, ...

JDBCに任せることをお勧めします。より少ないユーザーコード、より少ないトラブル:)

String queryAbb = "select idabbonamento, tipo, datainizio, datascadenza, ...";
...
a.setDataInizio(rs.getDate(3));
// reading the formatted data:
System.out.println(new SimpleDateFormat().format(a.getDataInizio());

実際には、もう1つのトリックがありますが、気にする必要はありません。returnsですrs.getDate()java.sql.Date、おそらくを使用しますjava.util.Date。java.sql.Dateはjava.util.Dateのサブクラスであるため、これは問題ではありません。したがって、この割り当ては完全に有効です。

于 2013-02-06T13:16:52.740 に答える
0

データベースに依存しない方法で、java.text.SimpleDateFormat. 例えば:

java.util.Date date = rs.getDate(3);
String dateFormatted = (new java.text.SimpleDateFormat()).format(date);
a.setDataInizio(dateFormatted);
于 2013-02-06T13:19:54.400 に答える
0

これを試して:

select idabbonamento, tipo, convert(char(10), datainizio, 105)....
于 2013-02-06T13:12:28.957 に答える