= Supported Java8 Time types This is a temporary document to describe the state of the java.time.* integration in Apache OpenJPA. == JPA-2.2 required types The following java.time types have to be supported mandatorily in JPA-2.2: * java.time.LocalDate * java.time.LocalTime * java.time.LocalDateTime * java.time.OffsetTime * java.time.OffsetDateTime Apache OpenJPA additionally supports the following types: * TODO java.time.Instant etc Not every database supports all those types natively though. Some cannot store them at all, others have a mode which e.g. doesn't store the Offset part. For our example we assume we live in Europe (+1 timezone). If you store 04:12-9 then you might actually end up with 14:12+1 when retrieving the value from the database. That means that OpenJPA tries to at least keep the instant correct if the database doesn't support zones natively. == Database Support matrix: [cols=6*,options=header] |=== | DBName | LocalDate | LocalTime | LocalDateTime | OffsetTime | OffsetDateTime | Derby | DATE | TIME | TIMESTAMP | not natively supported | not natively supported | PostgreSQL | DATE | TIME | TIMESTAMP | TIME WITH TIME ZONE | TIMESTAMP WITH TIME ZONE | MySQL | DATE | TIME | DATETIME | not natively supported, fallback to TIME | not natively supported, fallback to DATETIME | MariaDB | DATE | TIME | DATETIME | not natively supported, fallback to TIME | not natively supported, fallback to DATETIME | Microsoft SQLServer | DATE | TIME | DATETIME2 | | | Oracle | DATE | TIME | DATE | TIME WITH TIME ZONE | TIMESTAMP WITH TIME ZONE | H2 | DATE | TIME | DATE | | ... |=== === Notes ==== PostgreSQL PostgreSQL supports some of the types natively in the JDBC driver: * LocalDate * LocalTime * LocalDateTime * OffsetDateTime Note that `OffsetTime` is not supported in `setObject/getObject`. Also note that PostgreSQL always stores DateTime values internally as UTC. Thus when retrieving the date back from the Database again you will get the same Instant representation, but in a the local TimeZone! ==== MySQL & MariaDB MySQL supports LocalDate, LocalTime and LocalDateTime in `setObject/getObject`. It also supports OffsetTime and OffsetDateTime in `setObject/getObject`, but only via conversion. So the MySQL JDBC driver will effectively convert them to the local timezone and keep the 'Instant'. MariaDB does basically the same. ==== Oracle