ТЛ; др
получить дату между одинарными кавычками?
Не надо. Вы должны использовать умные объекты, а не тупые строки, чтобы обмениваться значениями дат с вашей базой данных.
Используйте java.time классы, которые заменили классы устаревших классов.
Для значений только по дате используйте LocalDate
класс, который заменил java.sql.Date
.
myPreparedStatement.setObject(
… ,
LocalDate.of( 2018 , Month.JANUARY , 23 )
)
… и поиск…
myResultSet.getObject(
… ,
LocalDate.class
)
java.time
Ответ Тима Бигелайзена правильный, но использует старые проблемные классы. java.util.Date
, java.sql.Date
, SimpleDateFormat
и связанные с ними старые классы даты и времени были вытеснены несколько лет назад классами java.time .
Начиная с JDBC 4.2 и более поздних версий, мы можем напрямую обмениваться объектами java.time с базой данных. Используйте PreparedStatement::setObject
и ResultSet::getObject
методы.
Дата только
Если столбец вашей базы данных имеет тип только для даты без времени суток и без часового пояса, аналогично стандартному типу SQL DATE
, используйте класс LocalDate
. Пример кода:
LocalDate localDate = LocalDate.of( 2018 , Month.JANUARY , 23 ) ; // 2018-01-23.
String sql = "SELECT * FROM t02 WHERE t02_create_date = ? ;" ; // Tip: Make a habit of closing your SQL properly with a semicolon. Won't hurt, and might help.
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setObject( 1 , localDate );
ResultSet rs = ps.executeQuery();
while (rs.next()) {
LocalDate ld = rs.getObject( 1 , LocalDate.class ) ; // Retrieve an `LocalDate` class.
}
Дата-время
Если столбец вашей базы данных имеет тип «дата со временем», аналогичный стандарту TIMESTAMP WITH TIME ZONE
стандарта SQL, используйте класс Instant
. Пример кода:
LocalDate instant = LocalDate.of(
String sql = "SELECT * FROM t02 WHERE t02_create_date = ? ;" ; // Tip: Make a habit of closing your SQL properly with a semicolon. Won't hurt, and might help.
PreparedStatement ps = conn.prepareStatement( sql ) ;
ps.setObject( 1 , instant );
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Instant instantRetrieved = rs.getObject( 1 , Instant.class ) ; // Retrieve an `Instant` class.
// You may want to adjust from UTC to some other time zone.
ZoneID z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instantRetrieved.atZone( z ) ; // Same moment, same point on the timeline, different wall-clock time as seen by the people of some particular region (a time zone).
}
О 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 .