Доступ к полю временной метки postgresql из Oracle через ODBC приводит к потере точности времени в микросекундах.

Я пытаюсь получить доступ к записи PostgreSQL из Oracle через ODBC, возникает серьезная проблема, когда я пытаюсь прочитать поле метки времени, теряется точность времени в микросекундах. Например: 2018-01-25 12:40:20.123456 в PostgreSQL будет 2018-01-25 12:40:20.000000 в Oracle. Чтобы убедиться, я написал PL/SQL для проверки данных, почему-то все микросекундные цифры были потеряны.

В документации говорится о параметре строки подключения BTD - BIND TIMESTAMP AS DATE ссылка

По умолчанию этот параметр должен иметь значение FALSE.

Привязать TIMESTAMP как DATE (строка подключения BTD)

Добавлен новый параметр подключения, Bind TIMESTAMP as DATE, который позволяет привязать тип данных SQL_TIMESTAMP драйвера ODBC к типу данных Oracle DATE, а не к типу данных Oracle TIMESTAMP (который используется по умолчанию).

Вот мой PL/SQL:

declare
  v_timestamp timestamp(6);
begin
  select max("MODIFIED_ON") into v_timestamp from "public"."DAS_ITEM"@PG_LINK;
  dbms_output.put_line(v_timestamp);
end;

Результат: 19/JAN/18 08:59:42.000000 AM , пропущены микросекунды, все 6-значные доли секунды заменены на ноль.

С другой стороны, на моем PostgreSQL результат 2018-01-19 08:59:42.695166

Я также тестировал isql, он возвращает значение метки времени с полной точностью, как следствие, я считаю, что основная причина исходит от Oracle.


person Nguyen Vinh Linh    schedule 25.01.2018    source источник


Ответы (1)


Тип данных Oracle DATE не поддерживает доли секунды. Для этого вам нужно использовать TIMESTAMP. Это также относится к любым столбцам таблицы или типам данных PL/SQL, в которые входят временные метки PostgreSQL; если метки времени передаются где-то в DATE, доли секунд будут усечены.

person Bernhard Ryeng    schedule 25.01.2018
comment
в PL/SQL я объявил переменную с типом данных timestamp(6), затем я получил максимальное значение timestamp из PostgreSQL, вставленное в эту переменную. Когда я печатаю значение, оно пропустило микросекунду. По умолчанию я должен получить отметку времени с полной точностью. Что-то происходит в середине. Вы пытались получить метку времени из PostgreSQL, как это было? - person Nguyen Vinh Linh; 25.01.2018
comment
Как вы печатаете? Также попробуйте NLS_TIMESTAMP_FORMAT = 'ГГГГ-ММ-ДД ЧЧ:МИ:СС.ФФ' - person Bernhard Ryeng; 25.01.2018
comment
Я попытался alter session set NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH:MI:SS.FF'; затем снова запустить PL/SQL. Результат: 2018-01-19 08:59:42.000000 - person Nguyen Vinh Linh; 25.01.2018
comment
Вопрос, Если я хочу изменить BTD - BIND TIMESTAMP AS DATE, где я должен изменить его. Я новичок в архитектуре оракула. - person Nguyen Vinh Linh; 25.01.2018
comment
BTD — это параметр строки подключения: docs.oracle.com/database/121. /ADFNS/adfns_odbc.htm#ADFNS1183 - person Bernhard Ryeng; 26.01.2018
comment
PL/SQL выглядит нормально. Не уверен, что вы можете указать BTD=F в ссылке на базу данных, возможно, его нужно определить в tnsnames.ora. (Хотя, как вы указываете, в документации говорится, что по умолчанию должно быть F.) - person Bernhard Ryeng; 26.01.2018
comment
(SQL Server) пример изменения tnsnames.ora здесь: dba-oracle.com/t_create_database_link_oracle.htm Подход без редактирования tnsnames.ora здесь: msutic.blogspot.no/2009/07/ - person Bernhard Ryeng; 26.01.2018