Java 检查'的时间戳;0000-00-00';不浇铸
我知道Java 检查'的时间戳;0000-00-00';不浇铸,java,mysql,sql,casting,Java,Mysql,Sql,Casting,我知道java.sql.Timestamp不接受'0000-00-00 00:00:00'作为值(有充分的理由)。但我正在处理的数据库是用PHP和其他工具创建的,这似乎并不重要 我想要什么 我想要的是将数据从一个数据库复制到另一个数据库,同时动态更改一些值(如时间戳0000-00-00) 如何 我首先选择整个数据,并将每一行放入对象[]。它必须是对象,因为我必须存储该数组中的每个值,而不管类型如何 稍后,我将强制转换对象为字符串,以便将其插入数据库 问题 正如我所说,我想去掉'0000-00-0
java.sql.Timestamp
不接受'0000-00-00 00:00:00'
作为值(有充分的理由)。但我正在处理的数据库是用PHP和其他工具创建的,这似乎并不重要
我想要什么
我想要的是将数据从一个数据库复制到另一个数据库,同时动态更改一些值(如时间戳0000-00-00
)
如何
我首先选择整个数据,并将每一行放入对象[]
。它必须是对象
,因为我必须存储该数组中的每个值,而不管类型如何
稍后,我将强制转换对象
为字符串,以便将其插入数据库
问题
正如我所说,我想去掉'0000-00-00 00:00:00'
时间戳,所以我需要检查我的时间戳是否等于'000…
。
但是为了查看我的对象中存储了什么值,我需要将它转换为时间戳
,这就是java.sql.SQLException
抛出的原因,它警告我,0000….
不能转换为时间戳
代码(此方法返回一个字符串,该字符串与INSERT查询的其余部分连接在一起)
对不起,解释得太长了
简短问题
如何检查时间戳是否等于'0000-00-00 00 00:00'
,而不将对象
强制转换为时间戳
?会出现异常,因为该列不是Java时间戳,而是包含年-月-日小时:分:秒的非Java字符串
因此,需要将数据序列化为Java字符串。在这种情况下,强制转换将不起作用。会出现异常,因为该列不是Java时间戳,而是一个包含年-月-日小时:分钟:秒的非Java字符串
因此,需要将数据序列化为Java字符串。在这种情况下,强制转换将不起作用。您可以向JDBC驱动程序提供一个连接属性,该属性将返回无效日期,即NULL
。属性名为zeroDateTimeBehavior
有关详细信息,请参阅手册:
您可以向JDBC驱动程序提供一个连接属性,该属性将返回无效日期,即NULL
。属性名为zeroDateTimeBehavior
有关详细信息,请参阅手册:
MySQL Connector/J JDBC驱动程序有一个可用于处理此问题的:
zeroDateTimeBehavior
当驱动程序遇到完全由零组成的DATETIME值(MySQL使用它来表示无效日期)时会发生什么?有效值为“exception”、“round”和“convertToNull”
默认值为exception
您可能希望尝试使用round
或convertToNull
MySQL Connector/J JDBC驱动程序有一个允许您处理此问题的:
zeroDateTimeBehavior
当驱动程序遇到完全由零组成的DATETIME值(MySQL使用它来表示无效日期)时会发生什么?有效值为“exception”、“round”和“convertToNull”
默认值为exception
您可能想尝试使用round
或convertToNull
简单地更改SQL语句以适应您的条件怎么样?这样你每次都可以返回一个有效的时间戳?我不确定您的SQL方言,但也许您可以使用NVL
解决这个问题?您可以告诉MySQL驱动程序为这样的时间戳返回NULL您的意思是在SELECT语句中检查0000?像选择IF(column='0000-00-00','0000-01-01',column)?是的,差不多。对不起,我刚刚读了mysql标签。。。但是一匹没有名字的马可能给出了一个很好的解决方案!它是一个名为
zeroDateTimeBehavior
的连接属性,有关详细信息,请参见此处:只需更改SQL语句以适应您的条件如何?这样你每次都可以返回一个有效的时间戳?我不确定您的SQL方言,但也许您可以使用NVL
解决这个问题?您可以告诉MySQL驱动程序为这样的时间戳返回NULL您的意思是在SELECT语句中检查0000?像选择IF(column='0000-00-00','0000-01-01',column)?是的,差不多。对不起,我刚刚读了mysql标签。。。但是一匹没有名字的马可能给出了一个很好的解决方案!这是一个名为zeroDateTimeBehavior
的连接属性,有关详细信息,请参见此处:我尝试了您的序列化建议,但不幸的是,这两个byte[]
看起来不一样。虽然字符串的字节[]
实际上包含'0000-00-00…“
序列化对象总是给我这样的信息:��srjava.sql.Timestamp&▒��s�EINANOXRJAVA.util.Datehj�KYtxpCX��x
。因此,即使逐字节比较它们,它们也永远不匹配:/不过,这是一个很好的方法!谢谢你的主意!对,该示例不起作用,因为它序列化了孔列对象。我将对此进行更深入的研究…那些该死的跨平台序列化…;)我尝试了您的序列化建议,但不幸的是这两个byte[]
看起来不一样。虽然字符串的字节[]
实际上包含'0000-00-00…“
序列化对象总是给我这样的信息:��srjava.sql.Timestamp&▒��s�EINANOXRJAVA.util.Datehj�KYtxpCX��x
。因此,即使逐字节比较它们,它们也永远不匹配:/不过,这是一个很好的方法!谢谢你的主意!对,该示例不起作用,因为它序列化了孔列对象。我将对此进行更深入的研究…那些该死的跨平台序列化…;)