3

更新: のコンストラクターへの「1 秒の端数」パラメーターは、Timestamp実際にはナノ秒かかります... 100 分の 1 秒であると推測し、低い値は四捨五入されました。参考までに質問を残しました....

Oracle の C++ ライブラリである OCCI に苦労しています。要約すると:

  • オブジェクトを作成Timestampし、それらが 100 分の 1 秒単位で適切であることを確認します (ただし、もっと多くのことが必要です!)
  • stmt.setTimestampthenを使用して、マイクロ秒を保持する列executeUpdate()に挿入しますTIMESTAMP(6)
  • Oracle SQL Developer で行を選択する: 秒未満のコンポーネントは常に 0-ed14-JUL-11 06.03.27.000000000です。

問題

1 秒未満の精度が必要です。うまくいけばマイクロ秒です。サーバーでその精度を取得するために多くの作業を行っており、分析のために (少なくともその一部は) 必要です。

詳細

Timestamp年/月/日の時/分/秒/ミリ秒から 作成し、最後の秒を100分の1秒に減らします。これはコンストラクターがサポートしているようです。(私が見つけることができるOracleドキュメントは解釈を指定していませんが、fromText例では、「xff」は変換する値の「.##」接尾辞に明確に対応しています。TIMESTAMP(6)挿入できない場合、小数点以下6桁をサポートするポイントは何ですか?)

oracle::occi::Timestamp temp =
    oracle::occi::Timestamp(_env, year, month, day,
                            hour, minute, second, millisecond / 10);

// re-extract the broken-down time from temp to prove it's stored successfully
int ye;
unsigned mo, da, ho, mi, se, fs;
temp.getDate(ye, mo, da);
temp.getTime(ho, mi, se, fs);

return temp;

ここでfsは、期待どおりにミリ秒/10 の値を取得します。

私はこれを次のように使用します:

oracle::occi::Timestamp ts;
ts = _pImpl->makeOracleTimestamp(p->ATETimeStamp);
stmt.setTimestamp(11, ts);

フィールド 11 はTIMESTAMP(6).

Oracle SQL Developerで行を選択すると、タイムスタンプ列の他の部分は正しいですが、サブ秒コンポーネントは 0-ed ala14-JUL-11 06.03.27.000000000です。

どんな洞察も大歓迎です!

(関連する場合は、MSVC++ 2005、Oracle 10.2.0.4 SDK、SQL Developer 3.0.04 を使用します。他に関連するものがあるかどうかを尋ねてください)。

ありがとう、トニー

4

1 に答える 1

3

「小数秒」フィールドは、名目上、100 分の 1 ではなくナノ秒単位であることがわかります。オラクルがドキュメントでそれを言ってくれたらいいのに!私が名目上言うのは、それが本当に最下位桁を保持していれば、私が持っていた100分の1の値はナノ秒数として現れ、すぐに問題を推測したかもしれないからです.より大きい - カットオフポイントを調べていません)。

質問を見たり、調査/調査を試みたりした人に感謝します。

于 2011-07-15T06:03:41.860 に答える