1

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
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 に答える