tl; dr
Использование DATE
в SQL и LocalDate
в Java означает, что никогда не будет проблемы пяти с половиной часов.
DATE
тип данных
Чтобы сохранить значение только для даты, без времени суток и без часового пояса или смещения, в вашей базе данных используйте тип данных только для даты дляваша колонка.
В стандарте SQL и MariaDB это будет DATE
.
С JDBC 4.2 и более поздними версиями вы можете напрямую обмениваться java.time объекты типа LocalDate
с базой данных.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
myPreparedStatement.setObject( … , ld ) ;
И поиск.
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
Пример приложения
При отладке такой проблемы отложите свой реальный код приложения и создайте небольшое демонстрационное приложение, например, это, чтобы упростить проблему и устранить различные способствующие факторы.
Вот простой, но полный пример приложения.
В этом примере для простоты используется H2 Database Engine , встроенный в Java.Адаптируйте этот код к вашему конкретному серверу базы данных, чтобы получить MCVE .
package com.basilbourque.example;
import java.sql.*;
import java.time.LocalDate;
import java.time.Month;
public class DateTest {
public static void main ( String[] args ) {
DateTest app = new DateTest();
app.doIt();
}
private void doIt ( ) {
try {
Class.forName( "org.h2.Driver" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
try (
Connection conn = DriverManager.getConnection( "jdbc:h2:mem:example_db;DB_CLOSE_DELAY=-1" ) ; // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
Statement stmt = conn.createStatement() ;
) {
// Create table.
String sql = "CREATE TABLE event_ (\n" +
" pkey_ IDENTITY NOT NULL PRIMARY KEY ,\n" +
" name_ VARCHAR NOT NULL ,\n" +
" when_ DATE NOT NULL\n" +
") ; ";
System.out.println( sql );
stmt.execute( sql );
// Insert row.
sql = "INSERT INTO event_ ( name_ , when_ ) " + "VALUES ( ? , ? ) ;";
try ( PreparedStatement preparedStatement = conn.prepareStatement( sql ) ; ) {
String name = "whatever";
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
preparedStatement.setString( 1 , name );
preparedStatement.setObject( 2 , ld );
preparedStatement.executeUpdate();
}
// Query all.
sql = "SELECT * FROM event_ ;";
try ( ResultSet rs = stmt.executeQuery( sql ) ; ) {
while ( rs.next() ) {
//Retrieve by column name
Long pkey = rs.getLong( "pkey_" );
String name = rs.getString( "name_" );
LocalDate ld = rs.getObject( "when_" , LocalDate.class );
//Display values
System.out.println( "pkey: " + pkey + " | name: " + name + " | when: " + ld );
}
}
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
При запуске.
pkey: 1 |имя: что угодно |когда: 2018-01-23