java.sql.BatchUpdateException:将nvarchar数据类型转换为datetime数据类型导致超出范围的值

时间:2016-11-17 07:11:27

标签: java sql-server csv datetime jdbc

我正在尝试批量插入到SQL Server,我从csv文件中获取列值。

这是我处理csv文件的每一行的方式,但我得到了

  

nvarchar无法转换为数字

- 或 -

  

dateTime例外

代码:

 for (int i = 0; i < count; i++) {
            Object val = columnVal[i];
            if (StringUtils.isEmptyOrWhitespaceOnly(val.toString())) {
                System.out.println(val);
                ps.setObject(i + 1, null);
            } else {
                System.out.println(val);
                ps.setObject(i + 1, val);
            }

        }

1 个答案:

答案 0 :(得分:1)

当SQL Server数据类型为DATETIMEDATETIME2DATE等时,在设置对象的值时使用以下数据类型之一:

  • java.sql.date:您只需要一个日期部分
  • java.sql.timestamp:您需要日期+时间部分
  • 适用于Java 1.8+的
  • java.time类,您使用的是符合JDBC 4.2或更高版本的JDBC驱动程序;例如java.time.LocalDateTime

您可以从Stack Overflow上的this question获得更多见解。

修改

  

我正在尝试编写通用插件,因为我不知道来自csv文件的值是什么,即为什么我使用对象数组来获取值

在这种情况下,您应该要求CSV使用以ISO 8601格式格式化的日期/日期时间值。 SQL Server无法转换日期时间格式的任何排列。这是不可能的,因为美国的日期时间格式为mm/dd/yyyy,而大多数其他国家/地区的格式通常为dd/mm/yyyy

您可以使用T-SQL SET DATEFORMAT设置明确的日期格式,但您需要事先知道格式是什么,SQL Server也必须支持该格式。

编辑2:

  

实际上我尝试使用dd-mm-yyyy格式的日期,当我尝试使用日期时间格式为dd-mm-yyyy hh.mm.ss时,能够批量插入.am面临问题。有没有办法处理这个

对于第一种格式,如果语言环境发生变化,它可能很容易破解......然后它可以很容易地解释为mm-dd-yyyy

记住我的建议:在序列化日期时间时始终使用 ISO8061 格式。您需要使用YYYY-MM-DDThh:mm:ss[.mmm](T是文字T字符)或YYYYMMDD[ hh:mm:ss[.mmm]]。请参阅DATETIME - Supported String Literal Formats for datetime