Часовой пояс
Имейте в виду, что тип TIMESTAMP
в Derby подобен стандартному типу SQL TIMESTAMP WITHOUT TIME ZONE
(по крайней мере, похоже, что документация плохонаписано).Это означает, что в этом типе отсутствует понятие часовой пояс или смещение от UTC .Таким образом, этот тип не представляет конкретный момент, точку на временной шкале.Вместо этого он представляет потенциальных моментов в диапазоне около 26-27 часов, диапазоне часовых поясов по всему земному шару.
Например, если вы хранили полдень 23 января 2019 годаМы не знаем, имели ли вы в виду полдень в Токио, Япония, или несколько часов раньше, когда полдень в Калькутте, Индия.Или, может быть, вы имели в виду часы спустя, полдень в Париже, Франция.Или еще несколько часов спустя, когда в Монреаль Квебек прибудет полдень.Такое значение в этом типе будет означать полдень 23-го в любом месте , для любого из многих моментов в диапазоне 26-27 часов.
Так что не имеет смысла делатьзапрос на этот тип при сравнении с текущим моментом.
Но…
Если вы обрабатываете часовой пояс в своем приложении и делаете вид, что все значения в базе данных относятся к определенному часовому поясу, используйте эту зону при захвате текущего момента.
ZonedDateTime
В классах java.time мы используем ZonedDateTime
для представления момента во времени настенных часовиспользуется людьми определенного региона (часового пояса).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
Сброс ценной информации о зоне / смещении с помощью LocalDateTime
Мы можем удалить информацию о часовом поясе, оставив толькодата и время суток в объекте LocalDateTime
.
LocalDateTime ldt = zdt.toLocalDateTime()
Начало дня
Если вы ищете месяц, вы, вероятно, захотитеначать в начале дня.На мгновение мы позволим java.time определить первый момент дня, так как день не всегда начинается в 00:00 из-за таких аномалий, как летнее время (DST).Но в LocalDateTime
отсутствует зона / смещение, мы не можем объяснить такие аномалии.Поэтому мы просто перейдем к 00:00.
LocalDateTime ldtStartOfDay = ldt.with( LocalTime.MIN ) ;
Математика даты и времени
Чтобы добавить ваш месяц, мы можем сделать математику даты и времени, используя методы plus…
и minus…
.
LocalDateTime ldtMonthLater = ldtStartOfDay.plusMonths() ;
Заполнители SQL
Передайте эти значения для замены заполнителей в SQL в подготовленном выражении.
SELECT *
FROM QUALIFICATION
WHERE dlExpiryDate >= ?
AND dlExpiryDate < ?
;
JDBC 4.2
Начиная с JDBC 4.2 и выше, мы можем напрямую обмениваться объектами java.time с базой данных, используя setObject
& getObject
.Нет необходимости использовать ужасные классы, такие как java.sql.Timestamp
.
myPreparedStatement.setObject( 1 , ldtStartOfDay) ;
myPreparedStatement.setObject( 2 , ldtMonthLater) ;
При получении.
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
Рассмотрим другие базы данных
Возможно, вы захотите рассмотреть возможность использования других баз данных.Oracle прекратила связывать Derby как Java DB , так как было установлено, что он не подходит для производственного использования.
Если вам нужна база данных с открытым исходным кодом, написанная на Java, я бы предложил H2 Database Engine , подходящий как для встроенного использования, так и для сервера.Если вам нужен сервер баз данных с открытым исходным кодом, созданный для работы в тяжелых условиях корпоративного качества, я предлагаю Postgres .
О 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 .