2013-06-27 83 views
1

当我尝试使用java.sql.Timestamp值插入到在MySQL 5.6 DATETIME列时,我总是得到这样的错误:java.sql.Timestamp中的错误插入DATETIME

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'invoice_date' at row 1

原此项目的开发人员具有创建Prepared语句的自定义JAR,以便将java.util.Date转换为Timestamp以插入到DATETIME中,反之亦然,以及处理的数据库连接。请注意,这是我的假设,因为没有关于它的文档。尝试使用时间戳通过的PreparedStatement插入到DATETIME我有同样的结果,使用类似:

ps.setTimestamp(3, new Timestamp(date.getTime()));

我要创建我自己的连接,这样我可以使用java.sql.Date来解决这个问题。但是,它会将结果的时间值归零。我用

ps.setDate(3, new java.sql.Date(date.getTime()));

我也得到类似

2013-06-27 00:00:00

在表中,因为我们知道java.sql.Date不存储的时间。

令人惊讶的是,在使用MySQL 5.0的服务器上,此功能正常工作。我假设Timestamp中的毫秒值导致问题转换为DATETIME?由于原作品在旧版本中。有没有什么办法可以解决这个问题,而无需重新安装5.0的所有内容?

+0

使用Java.util.Date –

+0

我无法在PreparedStatement中使用java.util.Date。它必须首先变成java.sql.Date。 –

回答

1

如果问题是毫秒,那么显式日期格式化您的时间戳。如果用例在MySQL 5.0上成功,并且在5.0和5.6上部署了不同的jdbc驱动程序,则值得在MySQL 5.6上测试该驱动程序。最后,您没有在您的设置器中传递索引,并且不正确的日期时间值是空字符串。您是否在调试器/日志中验证过您并未试图插入空字符串?

+0

哦,对不起,在我输入这些样本行时忘记了包含索引。代码本身有一个索引和日志显示它们有价值。 我实际上在5.0和5.6上使用相同的jdbc驱动程序。 DATETIME类型会带一个String吗?我认为它必须是日期类型,如日期或时间戳。 –

+0

刚刚尝试格式化时间戳,并使用该字符串代替,这在我的测试中工作。谢谢您的帮助!仍然有必要为此创建自己的数据库连接,但由于自定义JAR而无法提供帮助。我只是做我的修改,所以它可以在5.0和5.6上运行。 –