我正在尝试使用来自 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