1

我正在尝试使用来自 mssql2012 的开放查询从 IBM 的 System i ODBC driver for i5;DB2 version 6.x 中提取数据。该查询使用日期范围谓词:其中 date(rhinvdt) 在 date('01/01/12')和 date('01/31/14')* 之间。这会导致返回消息:

“[IBM][System i Access ODBC 驱动程序][DB2 for i5/OS]SQL0181 - 日期、时间或时间戳字符串中的值无效。 ”。

当我在 IBM Data Studio 中执行完全相同的查询(剪切和粘贴)时,查询成功,返回了预期的数据。我意识到 IBM Data Studio 正在通过链接服务器连接使用 jdbc 与 mssql2012 开放式查询,但是,我对 iseries 方面的日期转换功能了解不够,不知道是否应该为 openquery 使用更好的转换替代方案。顺便说一句,我打印出 sql,所以我可以看看我的语法是否正确。这就是我能够从 mssql2012 消息输出中剪切和粘贴的内容,以便通过 IBM Data Studio 执行以获得结果集。我还执行了以下语句:从 sysibm.sysdummy1 中选择当前日期;从 IBM Data Studio 获取默认日期设置,返回: 02/05/14

这是代码

    DECLARE @Sql VARCHAR(4000)
    SET @sql = 'SELECT rhvendno, 
          rhvennam, 
          rhinvno, 
          rhinvdt
        FROM metrodev.rsphdr
        WHERE date(rhinvdt) between date(''' + '01/01/12' + ''') and date(''' + '01/31/14' + ''')
         FETCH FIRST 100 ROWS ONLY'

    print @sql
    exec(@sql) at ISERIES;

以下是print @sql 的结果:

     SELECT rhvendno, 
          rhvennam, 
          rhinvno, 
          rhinvdt
        FROM metrodev.rsphdr
        WHERE date(rhinvdt) between date('01/01/12') and date('01/31/14')
         FETCH FIRST 100 ROWS ONLY
4

1 回答 1

1

尝试以 ISO 格式提供日期值:'2012-01-01'. 的数据类型是rhinvdt什么?如果是 DATE,则不需要使用该date()函数,因为 DB2 会将字符值隐式转换为 DATE 类型。

顺便说一句,您连接的不是 z/OS:

[System i Access ODBC 驱动程序][DB2 for i5/OS]

于 2014-02-05T16:33:11.380 回答