JDBC4 插入日期“0001-01-01”

Posted

技术标签:

【中文标题】JDBC4 插入日期“0001-01-01”【英文标题】:JDBC4 insert date "0001-01-01" 【发布时间】:2015-12-31 01:23:17 【问题描述】:

我想使用 Java PreparedStatement 将“0001-01-01”作为值插入到 日期 字段中。

但是当我尝试这个时它会抛出异常:

String sql = "insert into mytable values(?)"
ps = conn.prepareStatement(sql);   
ps.setDate(1, java.sql.Date.valueOf("0001-01-01"));
ps.executeUpdate(); // throws exceptions here.

错误是:

提供的值不是数据类型日期时间的有效实例。检查源数据中的无效值。一个无效值的例子是小数位数大于精度的数值类型数据。

如果我不使用 PreparedStatement,我可以插入“0001-01-01”。然而, prepare 语句似乎不允许我插入这个值。

如果我插入“1969-01-01”而不是“0001-01-01”,它将起作用。

有什么想法吗?

更新: 以下是可能需要的更多信息。

    我们使用 sql server 2012。 我们必须使用“0001-01-01”,因为这些值已经存在。我正在更改一些非常非常古老的代码以使用准备语句。所以我必须在相同的功能中插入相同的值。

更新 2:

我们使用的是“date”数据类型,而不是“datetime”数据类型。 基于此https://msdn.microsoft.com/en-us/library/bb630352.aspx,“0001-01-01”未超出“日期”字段的范围。

此外,我可以在不使用准备语句的情况下将“0001-01-01”插入日期字段。即

   String sql = "insert into mytable values('0001-01-01')"
   java.sql.Statement statement = conn.createStatement();
   statement.executeUpdate(sql);

所以不是sql server的问题,也不是db字段的问题。

【问题讨论】:

尝试使用另一个日期来表示空日期,例如 01-01-1900 快速看一下.valueOf(...)的源码;) 您使用的是哪个 JDBC 驱动程序 JAR? jTDS 还是微软?哪个版本? 我无法使用 Microsoft SQL Server JDBC 驱动程序 jar (sqljdbc42.jar) 的 4.2 版重现此问题。我可以将该日期插入datedatetime2 列,并将其插入datetime 列会给出不同的错误消息。我使用的是 SQL Server 2014 Express 而不是 SQL Server 2012;我不知道这有什么不同。 @LukeWoodward "version 4.2" 不是驱动的版本,而是驱动支持的JDBC规范版本。 【参考方案1】:

尝试使用其他合适的 JDBC 驱动程序。

【讨论】:

以上是关于JDBC4 插入日期“0001-01-01”的主要内容,如果未能解决你的问题,请参考以下文章

MySQL“空”日期(0001-01-01)是不是有值

如何在 Java 中将日期插入 MySQL 数据库表?

如何防止 pandas.to_datetime() 函数将 0001-01-01 转换为 2001-01-01

时间日期函数整理

高效创建日期

将 blob 数据插入数据库