Slick の java.time 対応

普段 PlayFramework + Scala で開発していて、ORMには Slick を使うことが多い。Slickは version 3.3 から java.time をサポートするようになったのだが、MySQL の型との対応がひどく(ほとんどTEXTにマッピングされて使い物にならない)、DBにMySQLを使う場合には気をつけなければならない。この対応表が私の知る限り、SlickのUpgrade Guidesにしか見当たらなくていつも見失うので、メモしておく。

http://scala-slick.org/doc/3.3.3/upgrade.html#support-for-java.time-columns

MySQL

Java TypeSQL TypeExample SQL Literal
java.time.InstantTEXT'2019-02-03T18:20:28.660Z'
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeTEXT'18:20:28.661'
java.time.LocalDateTimeTEXT'2019-02-03T18:20:28.661'
java.time.OffsetTimeTEXT'18:20:28.661Z'
java.time.OffsetDateTimeTEXT'2019-02-03T18:20:28.661Z'
java.time.ZonedDateTimeTEXT'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jsbc.MySQLProfile

H2

Java TypeSQL TypeExample SQL Literal
java.time.InstantTIMESTAMP(9) WITH TIME ZONE'2019-02-03T18:20:28.660Z'
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeVARCHAR'18:20:28.661'
java.time.LocalDateTimeTIMESTAMP'2019-02-03 18:20:28.661'
java.time.OffsetTimeVARCHAR'18:20:28.661Z'
java.time.OffsetDateTimeVARCHAR'2019-02-03T18:20:28.661Z'
java.time.ZonedDateTimeVARCHAR'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.H2Profile

Postgres

Java TypeSQL TypeExample SQL Literal
java.time.InstantTIMESTAMP'2019-02-03 18:20:28.66'
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeTIME'18:20:28.661'
java.time.LocalDateTimeTIMESTAMP'2019-02-03 18:20:28.661'
java.time.OffsetTimeTIMETZ'18:20:28.661Z'
java.time.OffsetDateTimeVARCHAR'2019-02-03T18:20:28.661Z'
java.time.ZonedDateTimeVARCHAR'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.PostgresProfile

DB2

Java TypeSQL TypeExample SQL Literal
java.time.InstantVARCHAR(254)'2019-02-03T18:20:28.660Z'
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeVARCHAR(254)'18:20:28.661'
java.time.LocalDateTimeTIMESTAMP'2019-02-03 18:20:28.661'
java.time.OffsetTimeVARCHAR(254)'18:20:28.661Z'
java.time.OffsetDateTimeVARCHAR(254)'2019-02-03T18:20:28.661Z'
java.time.ZonedDateTimeVARCHAR(254)'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.DB2Profile

DerbyProfile

java TYPESQL typeexample sql literal
java.time.InstantVARCHAR(254)'2019-02-03T18:20:28.660Z'
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeVARCHAR(254)'18:20:28.661'
java.time.LocalDateTimeTIMESTAMP'2019-02-03 18:20:28.661'
java.time.OffsetTimeVARCHAR(254)'18:20:28.661Z'
java.time.OffsetDateTimeVARCHAR(254)'2019-02-03T18:20:28.661Z'
java.time.ZonedDateTimeVARCHAR(254)'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.DerbyProfile

Oracle

Java TypeSQL TypeExample SQL Literal
java.time.InstantTIMESTAMP(9) WITH TIME ZONETO_TIMESTAMP_TZ('2019-02-03 18:20:28.660 +00', 'YYYY-MM-DD HH24:MI:SS.FF3 TZH')
java.time.LocalDateDATETO_DATE('2019-02-03', 'SYYYY-MM-DD')
java.time.LocalTimeVARCHAR2(254)'18:20:28.661'
java.time.LocalDateTimeTIMESTAMPTO_TIMESTAMP('2019-02-03 18:20:28.661', 'YYYY-MM-DD HH24:MI:SS.FF3')
java.time.OffsetTimeTIMESTAMP(6) WITH TIME ZONETO_TIMESTAMP_TZ('1970-01-01 18:20:28.661 +0000', 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM')
java.time.OffsetDateTimeTIMESTAMP(6) WITH TIME ZONETO_TIMESTAMP_TZ('2019-02-03 18:20:28.661 +0000', 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM')
java.time.ZonedDateTimeTIMESTAMP(6) WITH TIME ZONETO_TIMESTAMP_TZ('2019-02-03 18:20:28.661 Europe/London', 'YYYY-MM-DD HH24:MI:SS.FF3 TZR')
slick.jdbc.OracleProfile

SQLite

Java TypeSQL TypeExample SQL Literal
java.time.InstantTIMESTAMP1549218028660
java.time.LocalDateDATE1549152000000
java.time.LocalTimeVARCHAR(254)'18:20:28.661'
java.time.LocalDateTimeTIMESTAMP1549218028661
java.time.OffsetTimeVARCHAR(254)'18:20:28.661Z'
java.time.OffsetDateTimeVARCHAR(254)'2019-02-03T18:20:28.661Z'
java.time.ZonedDateTimeVARCHAR(254)'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.SQLiteProfile

SQLServer

Java TypeSQL TypeExample SQL Literal
java.time.InstantDATETIMEOFFSET(6)(convert(datetimeoffset(6), '2019-02-03 18:20:28.66 '))
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeTIME(6)(convert(time(6), '18:20:28.661'))
java.time.LocalDateTimeDATETIME2(6)'2019-02-03 18:20:28.661'
java.time.OffsetTimeVARCHAR(MAX)'18:20:28.661Z'
java.time.OffsetDateTimeDATETIMEOFFSET(6)(convert(datetimeoffset(6), '2019-02-03 18:20:28.661 '))
java.time.ZonedDateTimeVARCHAR(MAX)'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.SQLServerProfile

Hsqldb

Java TypeSQL TypeExample SQL Literal
java.time.InstantTIMESTAMP(9) WITH TIME ZONE'2019-02-03 18:20:28.66'
java.time.LocalDateDATE'2019-02-03'
java.time.LocalTimeTIME(3)'18:20:28.661'
java.time.LocalDateTimeTIMESTAMP'2019-02-03 18:20:28.661'
java.time.OffsetTimeTIME(9) WITH TIME ZONE'18:20:28.661+0:00'
java.time.OffsetDateTimeTIMESTAMP(9) WITH TIME ZONE'2019-02-03 18:20:28.661+0:00'
java.time.ZonedDateTimeLONGVARCHAR'2019-02-03T18:20:28.661Z[Europe/London]'
slick.jdbc.HsqldbProfile