java.time.OffsetDateTime 的 SQL Server 数据库列类型是什么?

What is the SQL Server Database column type for java.time.OffsetDateTime?

提问人:mattsmith5 提问时间:11/10/2023 最后编辑:Basil Bourquemattsmith5 更新时间:11/10/2023 访问量:78

问:

我们正在尝试在 Java 中映射并插入到 SQL Server 中,使用 .我们的客户遍布全球多个不同的时区。OffsetDateTimeJDBCTemplate

OffsetDateTime 的正确 SQL Server/Azure SQL 数据列类型是什么?我在这里的图表中没有看到它。https://learn.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver16

using java.time.OffsetDateTime

private OffsetDateTime purchaseDate;

我正在考虑 MS SQL ,但是该表将 Java 类型显示为 ,而不是 。datetimeoffsetmicrosoft.sql.DateTimeOffsetjava.time.OffsetDateTime

但是,在 SQL 中使用似乎适用于 ,只是想确定一下。datetimeoffsetjava.time.OffsetDateTime

enter image description here

java sql-server jdbc azure-sql-database java-time

评论

0赞 mattsmith5 11/10/2023
你能给我发送链接或官方文档吗?我可能会关闭这个问题,关于这个话题的互联网帖子太多含糊不清和不同意,@DaleK,请随时发布答案,我可以发送积分,谢谢
0赞 AlwaysLearning 11/10/2023
热闹!我们需要具体一点,但 OffsetDateTime 类型文档将其定义为相对于 UTC/格林威治时间?UTC/格林威治不是一回事(多亏了原子钟,UTC从格林威治漂移,格林威治是平均太阳时),那么OffsetDateTime甚至代表了什么度量呢?
0赞 Basil Bourque 11/10/2023
@AlwaysLearning java.time 框架定义了自己的时间尺度,即 Java Time-Scale。请参阅有关 Instant 类的 Javadoc 的文档。对于通常由 Java 开发人员构建的业务应用程序而言,GMT、UTC 和 Java Time-Scale 之间没有实际区别。

答:

1赞 Basil Bourque 11/10/2023 #1
数据类型 标准 SQL MS SQL 服务器 爪哇岛
时间线上的点 TIMESTAMP WITH TIME ZONE datetimeoffset JDBC 中,使用 OffsetDateTime
在 JDBC 之外,通常最好使用 InstantZonedDateTime

要表示时间轴上的特定点,请使用 SQL 标准类型 。在 Microsoft SQL Server 中,该类型映射到 datetimeoffsetTIMESTAMP WITH TIME ZONE

Java 提供了三个类来表示时间轴上的一个点:

  • java.time.Instant
  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

第一个表示与UTC的时间子午线偏移为零时分秒的时刻。第二个是类似的,但可以有早于/晚于UTC的任意小时数-分钟-秒的偏移量。第三个包含一个时区,该时区是特定地区人民根据其政治家决定的过去、现在和未来偏移量的命名历史。

SQL标准几乎没有涉及日期时间问题,而且做得很差。该标准缺少 和 类中捕获的概念。因此,JDBC仅将类映射到类型的列。InstantZonedDateTimeOffsetDateTimeTIMESTAMP WITH TIME ZONE


至于你的图表,我不知道发生了什么。该图表似乎引用了此类 microsoft.sql.Types.DATETIMEOFFSET。该类似乎是 Microsoft JDBC 驱动程序的一部分。但是Microsoft定义自己的JDBC映射类是没有意义的,因为该类与JDBC兼容的程序不兼容。我不是 Microsoft 客户,因此我无法提供解释。

评论

0赞 mattsmith5 11/10/2023
很好,你从哪里得到参考资料?您似乎有 [2] [4],您是否还在 JDBC 中使用 offsetDateTime,而在 JPA 等其他应用程序中使用 Instance?谢谢
0赞 Basil Bourque 11/10/2023
@mattsmith5 (a) 我抄袭了我昨天写的答案。(b) 不,我不是这么说的。JPA(现在的 Jakarta Persistence)建立在 JDBC 之上。因此,JDBC 中的 SQL-Java 映射适用于此。
0赞 mattsmith5 11/12/2023
嗨,不确定你是否知道这个问题的答案,谢谢 stackoverflow.com/questions/77468561/......