= 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

