在没有强制转换的情况下检查'0000-00-00'的时间戳

时间:2014-02-12 13:47:26

标签: java mysql sql casting

我知道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

3 个答案:

答案 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

您可以尝试使用roundconvertToNull