63

为了使我们的代码更加标准,我们被要求将我们硬编码 SQL 变量的所有位置更改为准备好的语句,并改为绑定变量。

但是,我面临setDate().

这是代码:

        DateFormat dateFormatYMD = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        DateFormat dateFormatMDY = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date now = new Date();
        String vDateYMD = dateFormatYMD.format(now);
        String vDateMDY = dateFormatMDY.format(now);
        String vDateMDYSQL =  vDateMDY ;
        java.sql.Date date = new java.sql.Date(0000-00-00);

   requestSQL = "INSERT INTO CREDIT_REQ_TITLE_ORDER (REQUEST_ID," + 
                " ORDER_DT, FOLLOWUP_DT) " +  "values(?,?,?,)";


                prs = conn.prepareStatement(requestSQL);

                prs.setInt(1,new Integer(requestID));

                prs.setDate(2,date.valueOf(vDateMDYSQL));
                prs.setDate(3,date.valueOf(sqlFollowupDT));

执行 SQL 时出现此错误:

    java.lang.IllegalArgumentException
    at java.sql.Date.valueOf(Date.java:138)
    at com.cmsi.eValuate.TAF.TAFModuleMain.CallTAF(TAFModuleMain.java:1211)

我应该setString()用 a 代替to_date()吗?

4

6 回答 6

160

❐ 使用java.sql.Date

如果您的表有一个类型的列DATE

  • java.lang.String

    该方法java.sql.Date.valueOf(java.lang.String)接收到一个表示日期的字符串,格式为yyyy-[m]m-[d]d。例如:

    ps.setDate(2, java.sql.Date.valueOf("2013-09-04"));
    
  • java.util.Date

    假设你有一个endDatetype的变量java.util.Date,你可以这样进行转换:

    ps.setDate(2, new java.sql.Date(endDate.getTime());
    
  • 当前的

    如果要插入当前日期:

    ps.setDate(2, new java.sql.Date(System.currentTimeMillis()));
    
    // Since Java 8
    ps.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now()));
    

❐ 使用java.sql.Timestamp

如果您的表有一个类型的列TIMESTAMPor DATETIME

  • java.lang.String

    该方法java.sql.Timestamp.valueOf(java.lang.String)接收到一个表示日期的字符串,格式为yyyy-[m]m-[d]d hh:mm:ss[.f...]。例如:

    ps.setTimestamp(2, java.sql.Timestamp.valueOf("2013-09-04 13:30:00");
    
  • java.util.Date

    假设你有一个endDatetype的变量java.util.Date,你可以这样进行转换:

    ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime()));
    
  • 当前的

    如果您需要当前时间戳:

    ps.setTimestamp(2, new java.sql.Timestamp(System.currentTimeMillis()));
    
    // Since Java 8
    ps.setTimestamp(2, java.sql.Timestamp.from(java.time.Instant.now()));
    ps.setTimestamp(2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()));
    
于 2013-09-04T13:27:41.390 回答
23
于 2016-08-07T00:15:17.613 回答
3

文档明确表示会java.sql.Date抛出:

  • IllegalArgumentException- 如果给定的日期不是 JDBC 日期转义格式 ( yyyy-[m]m-[d]d)

此外,您不需要将 date 转换为 a Stringthen 到 a sql.date,这似乎是多余的(并且容易出错!)。相反,您可以:

java.sql.Date sqlDate := new java.sql.Date(now.getTime());
prs.setDate(2, sqlDate);
prs.setDate(3, sqlDate);
于 2013-09-04T13:31:55.857 回答
3

您遇到的问题是您从格式化的 java.util.Date 传递不兼容的格式来构造 的实例,由于它们使用不同的格式,因此java.sql.Date在使用时的行为方式不同。valueOf()

我还可以看到您的目标是保持小时和分钟,并且我认为您最好将数据类型更改为java.sql.Timestamp支持小时和分钟的数据类型,同时将数据库字段更改为 DATETIME 或类似的(取决于您的数据库小贩)。

无论如何,如果你想改变 from java.util.Date to java.sql.Date,我建议使用

java.util.Date date = Calendar.getInstance().getTime();
java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 
// ... more code here
prs.setDate(sqlDate);
于 2013-09-04T13:32:53.783 回答
1

如果您想将当前日期添加到数据库中,我会避​​免在 Java 中计算日期。如果客户端配置错误、时间错误、时区错误等,在 Java(客户端)端确定“现在”可能会导致数据库中的不一致。相反,可以在服务器端以方式如下:

requestSQL = "INSERT INTO CREDIT_REQ_TITLE_ORDER ("   +
                "REQUEST_ID, ORDER_DT, FOLLOWUP_DT) " +
                "VALUES(?, SYSDATE, SYSDATE + 30)";

...

prs.setInt(1, new Integer(requestID));

这样,只需要一个绑定参数,并且在服务器端计算的日期将是一致的。更好的是添加一个插入触发器CREDIT_REQ_TITLE_ORDER并让触发器插入日期。这有助于加强不同客户端应用程序之间的一致性(例如,有人试图通过 sqlplus 进行修复。

于 2013-09-06T01:31:11.230 回答
-1

不确定,但我认为您正在寻找的是从字符串创建 java.util.Date,然后将该 java.util.Date 转换为 java.sql.Date。

试试这个:

private static java.sql.Date getCurrentDate(String date) {

    java.util.Date today;
    java.sql.Date rv = null;
    try {

        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
        today = format.parse(date);
        rv = new java.sql.Date(today.getTime());
        System.out.println(rv.getTime());

    } catch (Exception e) {
        System.out.println("Exception: " + e.getMessage());
    } finally {
        return rv;
    }

}    

将为 setDate() 返回一个 java.sql.Date 对象;

上面的函数将打印出一个 long 值:

1375934400000

于 2013-09-04T13:36:37.283 回答