Sql server 如何使用JDBC在SQL Server datetimeoffset中以UTC格式存储日期和时间
我的Spring Boot应用程序需要以UTC存储和表示所有日期和时间,因此应用程序中的POJO使用Sql server 如何使用JDBC在SQL Server datetimeoffset中以UTC格式存储日期和时间,sql-server,java-8,spring-jdbc,jdbctemplate,datetimeoffset,Sql Server,Java 8,Spring Jdbc,Jdbctemplate,Datetimeoffset,我的Spring Boot应用程序需要以UTC存储和表示所有日期和时间,因此应用程序中的POJO使用OffsetDateTime数据类型,SQL Server 2016数据库使用datetimeoffset(7)列类型。JDBC库是符合JDBC 4.2标准的驱动程序。JVM的版本是Oracle Java 8 我正在使用SpringJDBC和NamedParameterJdbcTemplate来实现DAO实现类。没有JPA、ORM等 插入记录时,我使用jdbcTemplate.update(Str
OffsetDateTime
数据类型,SQL Server 2016数据库使用datetimeoffset(7)
列类型。JDBC库是符合JDBC 4.2标准的驱动程序。JVM的版本是Oracle Java 8
我正在使用SpringJDBC和NamedParameterJdbcTemplate
来实现DAO实现类。没有JPA、ORM等
插入记录时,我使用jdbcTemplate.update(String,Map)
。除了保存在数据库中的值与我通过地图提供的值不同之外,这似乎起到了作用。例如,namedParameters.put(“record_datetime”,someEntity.getRecordDatetime())
对象的recordDatetime
属性保存值的位置2018-05-31T13:20:01Z
作为2018-05-31T20:20:01.0000000+00:00
保存在数据库中。我恰好位于GMT-7时区,但该属性使用的数据类型为OffsetDataTime
,没有偏移量,即基本上是GMT
在尝试从数据库检索值时,我手头有一个更大的问题。我使用jdbcTemplate.queryForObject(String,Map,RowMapper)
并在RowMapper中使用resultSet.getObject(“record\u datetime”,OffsetDateTime.class)
。这将导致一个例外:
java.sql.SQLFeatureNotSupportedException: This operation is not supported.
我尝试使用OffsetDateTime.ofInstant(resultSet.getObject(“record\u datetime”,Instant.class),ZoneId.of(“UTC”)。抛出与上面相同的异常
这是一个非常常见的要求,能够以UTC和/或偏移值存储值。在其他应用程序中,我在DAO中使用了
java.util.Date
和java.sql.Date
(或java.sql.Timestamp
)来持久化日期或日期时间值,这通常效果很好。我不知何故发现这更难实现。一个明显的问题是,CallableStatement
没有明确支持OffsetDateTime
,因此很可能会在封面下进行一些转换,转换成时间戳
,甚至字符串
。即使您忽略了这一点,MS JDBC驱动程序似乎不支持OffsetDateTime
,因为最新的文档。我不知道您是否或者如何以某种方式将Spring连接到这个本机类型。