mssql2012 からのオープン クエリを使用して、IBM の System i ODBC ドライバー for i5;DB2 バージョン 6.x からデータを抽出しようとしています。クエリは日付範囲述語を使用しています: where date(rhinvdt) between date('01/01/12') and date('01/31/14')* . これにより、次のメッセージが返されます。
"[IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0181 - 日付、時刻、またはタイムスタンプ文字列の値が無効です。 ".
IBM Data Studio でまったく同じクエリ (カット アンド ペースト) を実行すると、クエリは成功し、期待されるデータが返されます。IBM Data Studio がリンク サーバー接続を介して jdbc と mssql2012 のオープン クエリを使用していることは認識していますが、Iseries 側の日付変換関数について十分に理解していないため、変換のより良い代替手段を openquery に使用する必要があるかどうかを判断できません。ところで、私はSQLを出力するので、構文が正しいかどうかを確認できます。これは、mssql2012 メッセージ出力からカット アンド ペーストして、そのまま IBM Data Studio 経由で実行し、結果セットを取得できたものです。次のステートメントも実行しました。select current date from 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