Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查'的时间戳;0000-00-00';不浇铸_Java_Mysql_Sql_Casting - Fatal编程技术网

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
。因此,即使逐字节比较它们,它们也永远不匹配:/不过,这是一个很好的方法!谢谢你的主意!对,该示例不起作用,因为它序列化了孔列对象。我将对此进行更深入的研究…那些该死的跨平台序列化…;)