Oracle OCCI stmt.setTimestamp insert TIMESTAMP(6): microseco

Oracle OCCI stmt.setTimestamp insert TIMESTAMP(6): microseconds always 0

本文关键字:microseco TIMESTAMP OCCI stmt setTimestamp insert Oracle      更新时间:2023-10-16

更新:Timestamp的构造函数的"fraction of a second"参数实际上需要纳秒…我猜是百分之一秒,我的低值被四舍五入了。问题留作参考....

我正在努力与Oracle的c++库- OCCI。概要:

  • 创建Timestamp对象并验证它们好到百分之一秒(尽管我想要更多!)
  • 使用stmt.setTimestamp然后executeUpdate()插入TIMESTAMP(6)列,应该保留微秒
  • 在Oracle SQL Developer中选择行:次秒组件总是0-ed,例如14-JUL-11 06.03.27.000000000

我需要亚秒级的精度——希望是微秒级!我们已经投入了大量的工作在我们的服务器中捕获这种精度,并且需要(至少一部分)用于分析。

详细信息

我从年/月/日小时/分钟/秒/毫秒创建了一个Timestamp,将最后一个减少到百分之一秒,因为这似乎是构造函数支持的。(我找不到Oracle文档指定解释,但在fromText示例中"xff"显然对应于"。##"要转换的值的第100个后缀。如果不能插入,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 ala 14-JUL-11 06.03.27.000000000

任何见解非常感谢!

(如果相关,使用msvc++ 2005, Oracle 10.2.0.4 sdk, SQL Developer 3.0.04 -请询问是否有其他可能相关的东西)。

谢谢,托尼

原来"小数秒"字段的名义单位是纳秒,而不是百分。我希望Oracle能在他们的文档中这么说!我之所以说名义上,是因为如果它真的保留了最低有效数字那么我得到的百分之一值就会以纳秒的形式出现,我可能会立即猜到问题所在-而不是看起来值<无论如何,会损失100纳秒(也许更大——我还没有探测截止点)。>

感谢所有看过这个问题或做过调查研究的人。