我知道java.sql.Timestamp
不接受'0000-00-00 00:00:00'
作为值(有充分理由)。但我正在处理的数据库是用PHP和其他工具创建的,似乎并不关心。
我想要什么
我想要的是将数据从一个数据库复制到另一个数据库,并在执行此操作时,动态更改某些值(如Timestamp 0000-00-00
)
如何
我首先SELECT
整个数据,并将每一行放在Object[]
中。它必须是Object
,因为我必须存储该数组中的每个值,无论其类型如何。
稍后我会将Object
转换并转换为String,以便将其插入数据库
问题
正如我所说,我想摆脱'0000-00-00 00:00:00'
时间戳,所以我需要检查我的Timestamp
是否等于'000...'
。
但是为了查看我的Object
中存储了什么值,我需要将其投放到Timestamp
,并且java.sql.SQLException
被抛出以警告我0000....
可以' t被转换为时间戳。
代码(此方法返回一个与INSERT-Query的其余部分连接的String)
Object column = row[columnIndex]; // column contains the value I want to check
if (column == null) { // when its a NULL I insert my dummy value
return "'0000-01-01 00:00:00'";
}
// here is the problem: to check if the value is 0000... I need to cast the object
// to a Timestamp.. but that's not allowed
if (((Timestamp) column).toString().equalsIgnoreCase("0000-00-00 00:00:00")) {
return "'0000-01-01 00:00:00'";
}
// when its neither null nor '0000... ' return the value as it is
String timestampString = ((Timestamp) column).toString();
return "'" + timestampString + "'";
很抱歉很长的解释。
简短问题
如何在不将'0000-00-00 00:00:00'
投射到Object
的情况下检查时间戳是否等于Timestamp
?
答案 0 :(得分:2)
您得到异常,因为该列不是Java时间戳,而是包含YEAR-MONTH-DAY HOURS:MINUTES:SECONDS的非Java字符串。
因此,您需要将数据序列化为Java String。在这种情况下,施法不起作用。
答案 1 :(得分:2)
您可以为JDBC驱动程序提供连接属性,该属性将返回无效日期NULL
。该属性名为zeroDateTimeBehavior
有关详细信息,请参阅手册:
http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
答案 2 :(得分:1)
MySQL Connector / J JDBC驱动程序有一个connection property,允许您处理:
zeroDateTimeBehavior
当驱动程序遇到完全由零组成的DATETIME值(由MySQL用来表示无效日期)时会发生什么?有效值为“exception”,“round”和“convertToNull”。
默认为exception
您可以尝试使用round
或convertToNull
。