【问题标题】:How to send date and time to SQL using java如何使用java将日期和时间发送到SQL
【发布时间】:2014-03-06 06:52:41
【问题描述】:

我正在调用数据库中的存储过程。 它的两个参数需要sql日期格式的日期和时间。

String x = new SimpleDateFormat("MM-dd-yyyy").format(new Date()) + " 00:00:00 AM";
String y = new SimpleDateFormat("MM-dd-yyyy").format(new Date()) + " 11:59:00 PM";
Date fromDate = null;
Date toDate = null;
try {
   fromDate = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss a").parse(x);
   toDate = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss a").parse(y);
} catch (ParseException ex) {
}
CallableStatement proc_stmt = con.prepareCall("{ call someproc(?,?) }");
proc_stmt.setDate(1, (java.sql.Date) fromDate);
proc_stmt.setDate(2, (java.sql.Date) toDate);

我相信如果我只发送日期(不包括时间),代码可以工作,但它对我没有用,因为数据库不会生成正确的结果。 当我运行上面的代码时,我得到了

ClassCastException:java.util.Date cannot be cast to java.sql.Date

有什么办法吗?

【问题讨论】:

标签: java sql date time


【解决方案1】:

使用java.sql.Timestamp 类来保存sql 字段的日期和时间,以及CallableStatement#setTimestamp

proc_stmt.setTimestamp(1, new java.sql.Timestamp(fromDate.getTime());

【讨论】:

    【解决方案2】:

    创建 java.sql 日期的新对象,然后在其中传递 java.util 日期。

    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
    

    【讨论】:

      【解决方案3】:

      我通常是这样的

      proc_stmt.setDate(1, new java.sql.Date(fromDate.getTime()));
      

      【讨论】:

        【解决方案4】:

        你为什么将Date 格式化为String 然后再次解析它?您根本不需要字符串表示形式。尽可能避免字符串转换——你对日期的文本表示并不真正感兴趣;你只是想指定一个值。

        你应该可以使用:

        // TODO: Consider time zones
        Calendar calendar = Calendar.getInstance();
        // Clear the time part of the calendar (leaving you with "start of day")
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        Timestamp start = new Timestamp(calendar.getTimeInMillis());
        
        // Adjust to "end of day"
        calendar.add(Calendar.DATE, 1);
        calendar.add(Calendar.MILLISECOND, -1);
        Timestamp end = new Timestamp(calendar.getTimeInMillis());
        
        CallableStatement statement = con.prepareCall("{ call someproc(?,?) }");
        statement.setTimestamp(1, start);
        statement.setTimestamp(2, end);
        

        请注意,我已改用 java.sql.Timestamp 而不是 java.sql.Date,因为看起来您确实需要日期和时间,而 java.sql.Date 仅代表日期。

        其他几点:

        • 如果您可以使用 Joda Time,它将使代码的第一部分更简单。总的来说,Joda Time 是一个非常更好的日期/时间 API。
        • 如果可能,我建议您更改存储过程以使用独占 结束时间。这样你就可以指定今天的开始和明天的开始。您无需担心值的粒度,因为您始终可以创建相邻但不重叠的间隔。特别是,我目前只将end 设置为一天结束到最后一个毫秒 - 但java.sql.Timestamp

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 2012-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多