Oracle OCCI stmt.setTimestamp вставить TIMESTAMP(6): микросекунды всегда 0

ОБНОВЛЕНИЕ: Параметр "доли секунды" конструктора Timestamp на самом деле занимает наносекунды... Я предположил, что это сотые доли секунды, и мои низкие значения были округлены. Вопрос оставлен для справки....

Я борюсь с библиотекой Oracle C++ - OCCI. Вкратце:

  • создание Timestamp объектов и проверка их исправности с точностью до сотых долей секунды (хотя хотелось бы большего!)
  • используя stmt.setTimestamp, затем executeUpdate() для вставки в столбец TIMESTAMP(6), который должен сохранять микросекунды
  • выбор строки в Oracle SQL Developer: компонент доли секунды всегда равен 0, например. 14-JUL-11 06.03.27.000000000.

Проблема

Мне нужна точность до доли секунды - надеюсь, микросекунды! Мы приложили много усилий, чтобы зафиксировать эту точность на наших серверах, и нам она нужна (по крайней мере, частично) для анализа.

Подробности

Я создаю Timestamp из года/месяца/дня часа/минуты/секунды/миллисекунды, уменьшая последнее до сотых долей секунды, поскольку это, кажется, поддерживает конструктор. (В документации 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 ala 14-JUL-11 06.03.27.000000000.

Любое понимание высоко ценится!

(Если уместно, с использованием MSVC++ 2005, Oracle 10.2.0.4 sdk, SQL Developer 3.0.04 — спросите, может ли что-то еще быть уместным).

Спасибо, Тони


person Tony Delroy    schedule 14.07.2011    source источник


Ответы (1)


Оказывается, поле «доли секунды» номинально указано в наносекундах, а не в сотых долях. Хотел бы я, чтобы Oracle сказал это в своих документах! Я говорю номинально, потому что, если бы он действительно сохранял наименее значащие цифры, то значения сотых, которые у меня были, появились бы как количество наносекунд, и я мог бы сразу догадаться о проблеме - вместо этого кажется, что значения ‹ 100 наносекунд все равно теряются (и, возможно, больше - точку отсечки не прощупывал).

Спасибо всем, кто просмотрел вопрос или попытался провести какое-то исследование / расследование.

person Tony Delroy    schedule 15.07.2011
comment
Я буду петь хвалу твоему имени во веки веков! Я только что потратил 2 часа на отладку, пока снова не наткнулся на этот пост. Я даже проголосовал за это 6 месяцев назад, я просто забыл об этой причуде, которая нигде не упоминается в (ужасной) документации OCCI. Благодарю вас! - person Johann; 25.12.2013
comment
@Johann: всегда пожалуйста - рад, что это помогло - жаль, что мне не хватило всего 2 часов разочарования ;-). Спасибо Оракул! О_о - person Tony Delroy; 25.12.2013