保存 Informix DATETIME YEAR TO SECOND 值的等效 Java 数据类型?

Posted

技术标签:

【中文标题】保存 Informix DATETIME YEAR TO SECOND 值的等效 Java 数据类型?【英文标题】:Equivalent Java data type to hold the Informix DATETIME YEAR TO SECOND value? 【发布时间】: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 驱动程序? 【参考方案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;

【讨论】:

据此informix.com.ua/doc/9.30/5343A.pdfjava.sql.Time就是答案

以上是关于保存 Informix DATETIME YEAR TO SECOND 值的等效 Java 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

DATETIME - 来自 Informix 的 HH:MM:SS 格式的 DATETIME

在 Informix 中将 DATETIME 转换为 Unix 纪元

在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数

确保在 Informix DATETIME 列上使用索引

Informix SQL 比较 Where 语句上的 DateTime 值

带有准备好的语句的 Informix 日期时间