【问题标题】:DATE FORMAT SQL日期格式 SQL
【发布时间】:2013-01-21 16:41:09
【问题描述】:

我有一个名为 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

上面的代码有什么问题?

【问题讨论】:

  • 你使用什么数据库?
  • @GaborSch 我正在使用 DBMS MYSQL...
  • @MahmoudGamal 但它没有..
  • 如果我在 dbms 中进行查询,结果是正确的,而如果我从 Java 打印日期,它会打印另一个值!

标签: java mysql sql date resultset


【解决方案1】:

试试这个:

select idabbonamento, tipo, convert(char(10), datainizio, 105)....

【讨论】:

    【解决方案2】:

    代替

    rs.getDate(3)
    

    你应该使用

    rs.getString(3)
    

    因为数据已经格式化为字符串。如果您想获得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() 返回java.sql.Date,但你可能使用java.util.Date。这不是问题,因为 java.sql.Date 是 java.util.Date 的子类,所以这个赋值是完全有效的。

    【讨论】:

    • 事实上setDataInizio 方法接受Date 类型。我无法传递字符串参数。
    • 是的,以这种方式它可以工作,但它会打印 2013-11-05 而不是 05-11-2013。这就是我试图用 date_FORMAT.. 方法做的事情。
    • 您也有读取数据的问题。例如,我更新了如何格式化dataInizio 的答案,但这实际上取决于您的框架。也许在Abbonamento 类中,您可以引入public String getFormattedDataInizio(),您可以在其中隐藏我刚刚放在上面的格式代码。
    • 很好,只需添加另一个getter,它会返回相同的数据,但格式化
    • 不,我现在使用的是 rs.getString(3) 但日期格式为:yyyy-mm-dd
    【解决方案3】:

    以独立于数据库的方式,您可以使用java.text.SimpleDateFormat。例如:

    java.util.Date date = rs.getDate(3);
    String dateFormatted = (new java.text.SimpleDateFormat()).format(date);
    a.setDataInizio(dateFormatted);
    

    【讨论】:

    • 好的,然后你应该给它分配一个日期,就像你做的那样,当你需要提取日期时,使用java.text.SimpleDateFormat类来格式化它。
    • A java.util.Date 没有关联的格式。它是日期的数字表示,需要格式化才能将其转换为字符串
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 2014-05-31
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多