【问题标题】:check Timestamp for '0000-00-00' without casting在不强制转换的情况下检查“0000-00-00”的时间戳
【发布时间】:2023-03-23 21:35:01
【问题描述】:

我知道java.sql.Timestamp 不接受'0000-00-00 00:00:00' 作为值(有充分的理由)。但是我正在处理的数据库是用 PHP 和其他工具创建的,这似乎并不在意。

我想要什么

我想要的是将数据从一个数据库复制到另一个数据库,并在执行此操作时即时更改一些值(例如 Timestamp 0000-00-00

如何

我首先SELECT 将整个数据放入Object[] 中。它必须是Object,因为无论类型如何,我都必须将每个值都存储在该数组中。

稍后我会将Object 转换为字符串,以便将其插入数据库中

问题

正如我所说,我想摆脱 '0000-00-00 00:00:00' 时间戳,所以我需要检查我的 Timestamp 是否等于 '000...'。 但是为了查看我的Object 中存储了什么值,我需要将其转换为Timestamp,这就是java.sql.SQLException 被抛出以警告我0000.... 不能转换为时间戳的地方。

代码(此方法返回一个与 INSERT-Query 的其余部分连接的字符串)

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

【问题讨论】:

  • 简单地更改您的 SQL 语句以适应您的条件怎么样?这样您就可以每次都返回一个有效的时间戳?我不确定你的 SQL 方言,但也许你可以用 NVL 解决它?
  • 你可以告诉 MySQL 驱动为这样的时间戳返回 NULL
  • 您的意思是在 SELECT 语句中检查 0000?像 SELECT IF(column='0000-00-00','0000-01-01',column)... ?
  • 是的,类似的。抱歉,我刚刚看了mysql标签...但是a_horse_with_no_name可能已经给出了一个很好的解决方案!
  • 这是一个名为zeroDateTimeBehavior的连接属性,详情请看这里:dev.mysql.com/doc/connector-j/en/…

标签: java mysql sql casting


【解决方案1】:

您可以向 JDBC 驱动程序提供一个连接属性,该属性将返回无效日期为 NULL。该属性被命名为zeroDateTimeBehavior

详情见手册:

http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

【讨论】:

    【解决方案2】:

    您收到异常是因为该列不是 Java Timestamp,而是包含 YEAR-MONTH-DAY HOURS:MINUTES:SECONDS 的非 Java 字符串。

    因此,您需要将数据序列化为 Java 字符串。在这种情况下无法进行投射。

    【讨论】:

    • 我试过你的序列化建议,但不幸的是这两个byte[] 看起来不一样。虽然字符串的byte[] 实际上包含'0000-00-00...',但序列化的对象总是给我类似:��srjava.sql.Timestamp&▒��S�eInanosxrjava.util.Datehj�KYtxpCX��x。因此,即使逐字节比较它们,它们也永远不会匹配:/仍然是不错的方法!感谢您的想法!
    • 对了,这个例子不行,因为它序列化了孔列对象。我将对此进行更深入的研究...那些该死的跨平台序列化... ;)
    【解决方案3】:

    MySQL 连接器/J JDBC 驱动程序有一个 connection property 允许您处理此问题:

    zeroDateTimeBehavior
    

    当驱动程序遇到完全由零组成的 DATETIME 值(MySQL 使用它来表示无效日期)时会发生什么?有效值为“exception”、“round”和“convertToNull”。

    默认为exception

    您可能想尝试使用roundconvertToNull

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2015-06-09
      • 1970-01-01
      相关资源
      最近更新 更多