sql >> Databáze >  >> RDS >> Mysql

Neshoda mezi hodnotami DATETIME v databázích H2 a MySQL vložených z Java/Kotlin

Zdá se tedy, že opravou bylo nastavení časového pásma UTC pro připojení JDBC (místo JVM):

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

a spoléhá na použití Instant pro zachování hodnoty na straně Java a pomocí created_at pole s typem DATETIME v MySQL a H2.

Zkrácený výsledný kód kotlin je:

@Entity
data class SomeEntity(
    val createdAt: Instant = Instant.now() // default created date is current UTC time
)

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss")

createdAt = LocalDateTime.parse("2012-11-30 16:13:21", dateTimeFormatter).toInstant(ZoneOffset.UTC)

Nápady převzaté z komentářů "Joop Eggen", toto a toto článek.

Bonus

Myslím, že pokud toto čtete, možná budete také potřebovat pomoc s laděním SQL dotazů.

1. Chcete-li tisknout dotazy SQL spuštěné na H2, přidejte TRACE_LEVEL_FILE=2 a TRACE_LEVEL_SYSTEM_OUT=2 na připojovací řetězec (viz zde ):

spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;

2. Povolení protokolů hibernace:

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type=TRACE

3. Chcete-li povolit protokoly dotazů v MySQL (jeden z přístupů, nepoužívejte na produkční databázi!):

SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;



  1. Jak analyzovat v PHP a ukládat do databáze?

  2. Jak ELT() funguje v MariaDB

  3. Zkuste znovu zablokovat MySQL / SQLAlchemy

  4. Proč potřebujete datové modelování?