Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用JDBC在SQL Server datetimeoffset中以UTC格式存储日期和时间_Sql Server_Java 8_Spring Jdbc_Jdbctemplate_Datetimeoffset - Fatal编程技术网

Sql server 如何使用JDBC在SQL Server datetimeoffset中以UTC格式存储日期和时间

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

我的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(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连接到这个本机类型。