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)

因为数据已经格式化为字符串。如果您想获取 as Date,首先,从您的字符串创建一个 Date 对象05-11-2013,然后您会收到它。

如果您的对象中有Date对象,您应该返回与您从数据库返回的格式相同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());

实际上,还有一个技巧,但你不必关心:rs.getDate()returns java.sql.Date,但你可能会使用java.util.Date. 这不是问题,因为 java.sql.Date 是 java.util.Date 的子类,所以这个赋值是完全有效的。

于 2013-02-06T13:16:52.740 回答
0

试试这个:

select idabbonamento, tipo, convert(char(10), datainizio, 105)....
于 2013-02-06T13:12:28.957 回答
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 回答