Java - Oracle - БД Вставка - Временная метка в столбец Дата - PullRequest
4 голосов
/ 26 августа 2011

У меня есть столбец таблицы типа данных DATE.Я вставляю через Java PreparedStatement, как я могу сохранить метку времени при вставке?Можно ли сохранить отметку времени в столбце DATE?

Я пытался

ps.setTimestamp(index, new java.sql.Timestamp(date.getTime()));

Но не сработало.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 26 августа 2011

Отображение между типами SQL и типами JDBC в Oracle немного сложнее, особенно для типов SQL DATE и TIMESTAMP.

База данных Oracle позволяет хранить информацию о метках времени в столбцах DATE,что совершенно противоречит определению DATE в стандарте SQL.До версии 9.2, когда была введена поддержка столбцов TIMESTAMP, Statement.setTimestamp работало бы для столбцов DATE.Начиная с 9.2 и до 11.1 драйвер JDBC отображал тип SQL DATE на JDBC Date, а тип SQL TIMESTAMP на JDBC Timestamp.Возможные решения для хранения меток времени с использованием драйверов 10.2 JDBC перечислены в Oracle JDBC FAQ и воспроизводятся здесь:

Существует несколько способов решения этой проблемы в 9.2.через драйверы 10.2:

  • Измените ваши таблицы, чтобы использовать TIMESTAMP вместо DATE.Это, вероятно, редко возможно, но это лучшее решение, когда оно есть.

  • Измените ваше приложение, чтобы использовать defineColumnType для определения столбцов как TIMESTAMP, а не DATE.Есть проблемы с этим, потому что вы действительно не хотите использовать defineColumnType, если вам не нужно (см. Что такое defineColumnType и когда я должен его использовать?).

  • Измените приложение для использованияgetTimestamp, а не getObject.Это хорошее решение, когда это возможно, однако многие приложения содержат общий код, основанный на getObject, поэтому это не всегда возможно.

  • Установить свойство соединения V8Compatible.Это говорит драйверам JDBC использовать старое отображение, а не новое.Вы можете установить этот флаг либо как свойство соединения, либо как системное свойство.Вы устанавливаете свойство соединения, добавляя его в объект java.util.Properties, передаваемый DriverManager.getConnection или OracleDataSource.setConnectionProperties.Вы устанавливаете системное свойство, включив параметр -D в командной строке Java.

    java -Doracle.jdbc.V8Compatible = "true" MyApp

Вы также можете использовать драйверы JDBC 11.1 (они будут работать с экземпляром 10g), и в FAQ есть следующее:

Oracle JDBC 11.1 решает эту проблему.Начиная с этого выпуска драйвер по умолчанию сопоставляет столбцы SQL DATE с java.sql.Timestamp.Нет необходимости устанавливать V8Compatible для получения правильного сопоставления.Совместимость с V8 настоятельно не рекомендуется.Вы не должны использовать это вообще.Если вы установите значение true, это ничего не повредит, но вы должны прекратить его использование.

1 голос
/ 26 августа 2011

Я предлагаю тип TIMESTAMP , особенно когда мы хотим вычислить разницу во времени между двумя типами данных TIMESTAMP гораздо проще, чем тип данных DATE.Для получения более подробной информации, пожалуйста, взгляните на этот пост .

0 голосов
/ 26 августа 2011

Наконец-то выяснилось, что при хранении мы ничего не можем сделать.При выборе мы должны использовать TO_CHAR.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...