【问题标题】:Equivalent Java data type to hold the Informix DATETIME YEAR TO SECOND value?保存 Informix DATETIME YEAR TO SECOND 值的等效 Java 数据类型?
【发布时间】:2010-12-29 09:15:57
【问题描述】:

我想将 Informix DATETIME YEAR TO SECOND 映射到 Java 数据类型。

有人可以提供相应的 Java 数据类型来保存 Informix DATETIME YEAR TO SECOND 值吗?


这是答案:java.sql.Time 根据我的 JDBC 驱动程序。

【问题讨论】:

  • 您需要知道您的 JDBC 驱动程序在 Java 中的映射。我建议你尝试一下,找出类型。
  • Informix JDBC Driver 将 java.sql.Timestamp 映射到 Informix 类型 DATETIME YEAR TO FRACTION(5) 并将 java.sql.Time 映射到 Informix 类型 DATETIMEHOUR TOSECOND。 InformixDATETIME 类型非常严格并且不可互换。如果您尝试将 java.sql.Time 绑定到 DATETIME YEAR TO FRACTION(5) 或将 java.sql.Timestamp 绑定到 DATETIME HOUR TO SECOND,您可能会从 Informix 数据库服务器收到错误。不支持任何其他 DATETIME 限定符。
  • 感谢@peter 指出正确的方向 :-)
  • 您写了您使用的驱动程序将其映射到java.sql.Time,但我使用的驱动程序:JDBC.3.70.JC1DE 将DATETIME YEAR TO SECOND 映射到java.sql.Timestamp。也许您使用了一些旧版本的 Informix JDBC 驱动程序?

标签: java jdbc informix


【解决方案1】:

DATETIME YEAR TO SECOND 可以根据此文档映射到时间戳:

http://publib.boulder.ibm.com/infocenter/iwedhelp/v6r0/index.jsp?topic=/com.ibm.db2e.doc/dbsap_b3.html

TIMESTAMP 可以映射到 java.util.Date。
如果您需要对日期执行计算,请使用 java.util.Calendar:

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// Use the roll fonction to alter the date
// For example add one month to your Date
calendar.roll(Calendar.MONTH, 1);
// Get your Date back
date = calendar.getTime();

您是否使用任何框架来映射您的数据?

【讨论】:

  • 据此informix.com.ua/doc/9.30/5343A.pdfjava.sql.Time就是答案
  • Dinesh,我对其进行了测试,并使用我的 JDBC Informix 驱动程序 JDBC.3.70.JC1DE 将它映射到 TIMESTAMP。
  • 在 PDF 中我发现java.sql.Time 用于DATETIME HOUR TO SECOND。当您以YEAR 开头时,将使用java.sql.Timestamp重要提示:Informix JDBC Driver 将 java.sql.Timestamp 映射到 Informix 类型 DATETIME YEAR TO FRACTION(5) 并将 java.sql.Time 映射到 Informix 类型 DATETIME HOUR TO SECOND
【解决方案2】:

我使用 Jonathan Leffler 的表格做了简单的测试,回答: Informix 7.3 - Declaring a date column data type with default as current date on insert/update

我使用 Jython 和 JDBC Informix 驱动程序 JDBC.3.70.JC1DE。使用元数据的测试代码如下所示:

    db = DriverManager.getConnection(db_url, usr, passwd)
    c = db.createStatement()
    rs = c.executeQuery("SELECT * FROM test_datetime")
    rsmd = rs.getMetaData()
    print('columnCnt: %d' % (rsmd.getColumnCount()))
    while (rs.next()):
        for i in range(rsmd.getColumnCount()):
            col_no = i + 1
            print("value: [%s]" % rs.getString(col_no))
            print("name: [%s]" % rsmd.getColumnName(col_no))
            print("Java type: %d" % rsmd.getColumnType(col_no))
            print("Java class name: %s" % rsmd.getColumnClassName(col_no))
            print("column type name: %s" % rsmd.getColumnTypeName(col_no))
            print('-' * 20)

有趣列的输出:

value: [03.01.11]
name: [date_column]
Java type: 91
Java class name: java.sql.Date
column type name: date
--------------------
value: [2011-01-03 00:00:00.0]
name: [datetime_yd]
Java type: 93
Java class name: java.sql.Timestamp
column type name: datetime year to day
--------------------
value: [2011-01-03 10:28:51.0]
name: [datetime_ys]
Java type: 93
Java class name: java.sql.Timestamp
column type name: datetime year to second
--------------------
value: [10:28:51]
name: [datetime_hs]
Java type: 92
Java class name: java.sql.Time
column type name: datetime hour to second

因此,此版本 JDBC 驱动程序的正确答案是:datetime year to second 映射到 java.sql.Timestamp

PS 您写道,您的驱动程序将其映射到 java.sql.Time,但也许您使用了一些旧版本的 Informix JDBC 驱动程序?

【讨论】:

    【解决方案3】:

    您是否尝试过使用 java.sql.Date ?我不了解 Informix,但它似乎是此类数据的自然类型,不是吗?

    【讨论】:

    • 不,Java SQL 日期,就像它的父类java.util.Date,实际上存储了一个时间戳,精确到毫秒。其实只是名字误导而已。
    【解决方案4】:

    如果你想访问小时、分钟和秒值,你可以使用 java.util.Date..

    【讨论】:

      【解决方案5】:

      是的,我得到了你的问题 .. 你可以使用 Timestamp 数据类型

      例如……

      Timestamp temp;
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多