Java, связанные со временем объекты и функция оракула to_date - PullRequest
0 голосов
/ 07 мая 2018

У меня есть база данных Oracle со столбцом UPDATED, помеченным в sqlDeveloper как TIMESTAMP(6). Пример записи в этом столбце: 05-MAY-18 04.49.45.000000000

Я хочу выполнить следующий запрос к нему, используя подготовленный оператор:

SELECT * FROM EXAMPLE_TABLE WHERE UPDATED > TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'.

Вопрос в том, как связать объект даты и времени Java (от org.joda.time.LocalDateTime или java.time.LocalDateTime или любой другой, который хранит как данные, так и время?

Вот тестовый фрагмент, независимо от того, что я делаю, я не могу заставить его работать (кроме ситуации, когда я связываю new Date(2018, 5,5), но, во-первых, это просто дата без времени, а во-вторых, sql.Date устарел.

public class Dbaccess {
    public static void main(String[] args) throws SQLException {
        Connection connection = DriverManager.getConnection("someurl", "some_username", "some_password");
        PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM EXAMPLE WHERE UPDATED > TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')");
        preparedStatement.setObject(1, LocalDateTime.now());
        ResultSet resultSet = preparedStatement.executeQuery();
        System.out.println("resultSet:" + resultSet);
        while(resultSet.next()) {
            System.out.println(resultSet.getString("some_id"));
        }
    }
}

К сожалению, я получаю Exception in thread "main" java.sql.SQLException: Invalid column type.

Как мы должны в наши дни связывать такую ​​переменную, которая должна представлять дату и время?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

ТЛ; др

Проверьте, какая версия JDBC поддерживается вашим драйвером JDBC.

В JDBC 4.2 и более поздних версиях вы можете делать следующее:

myPreparedStatement.setObject(
    … ,
    LocalDateTime.now()
)

До JDBC 4.2, см. Ответ от YCF_L .

JDBC 4.2

Начиная с JDBC 4.2, вы можете напрямую обмениваться объектами java.time с вашей базой данных. Больше не нужно использовать java.sql.Timestamp снова.

LocalDateTime ldt = LocalDateTime.now() ;  // Better to pass explicitly your desired time zone rather than rely implicitly on the JVM’s current default.

Перейдите к подготовленному выписке методом setObject.

myPreparedStatement.setObject( … , ldt ) ;

индексирование.

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

JDBC 4.1 и более ранние версии

Если ваш драйвер JDBC еще не обновлен для JDBC 4.2 или более поздней версии, см. Ответ от YCF_L .


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 07 мая 2018

попробуйте использовать setDate так:

LocalDateTime ldt = LocalDateTime.now();
//Convert LocalDateTime to SQL TimeStamp
java.sql.Timestamp dateTimeSql = java.sql.Timestamp.valueOf(ldt);
//Set this time stamp to the query
preparedStatement.setDate(1, java.sql.Timestamp.valueOf(dateTimeSql));

Или просто:

preparedStatement.setDate(1, 
     java.sql.Timestamp.valueOf(java.sql.Timestamp.valueOf(LocalDateTime.now()))
);

тогда вам не нужно использовать TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), вы можете просто использовать:

SELECT * FROM EXAMPLE WHERE UPDATED > ?
...