Oracle OCCI stmt.setTimestamp insert TIMESTAMP (6): микросекунды всегда 0 - PullRequest
3 голосов
/ 14 июля 2011

ОБНОВЛЕНИЕ: параметр «доля секунды» для конструктора 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 остальные части столбца метки времени являются правильными, но второстепенный компонент имеет нулевое значение 14-JUL-11 06.03.27.000000000.

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

(При необходимости, используя MSVC ++ 2005, Oracle 10.2.0.4 sdk, SQL Developer 3.0.04 - пожалуйста, спросите, может ли что-то быть уместным).

Спасибо, Tony

1 Ответ

3 голосов
/ 15 июля 2011

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

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

...