【问题标题】:How to insert datetime in this - " 2016-01-01T19:33:15-05:00" format in MSSQL using Java?如何使用 Java 在 MSSQL 中以“2016-01-01T19:33:15-05:00”格式插入日期时间?
【发布时间】:2021-10-30 08:29:09
【问题描述】:

我有一个定义为 datetime(2) 的列,我必须以这种格式创建一个新日期 - 2016-01-01T19:33:15-05:00

Entity: private Date transactionTime;

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date date = null;
try {
    date = formatter.parse(formatter.format(new Date()));
} catch (ParseException e) {
    e.printStackTrace();
}
obj.transactionTime(date);

它像这样插入到 SQL 中 - "2021-08-26 14:19:09.0000000" 但我需要以上述格式插入它。

【问题讨论】:

  • DATETIMEDATETIME2 类型都没有时区信息。
  • 即使 DATETIME 有时区信息,您在使用 Date 时已经丢失了该信息。并且格式化然后再次解析它也是一个无用的往返。至少应该使用支持偏移的 SQL 类型,并在 Java 端使用 java.time.OffsetDateTime
  • 您不将日期存储为字符串,而是将日期存储为日期数据类型并根据需要对其进行格式化。话虽如此,您可以在 sql server 中使用 DATETIMEOFFSET 数据类型,并且很可能它会按原样接受字符串文字。

标签: java sql-server spring-boot java-8


【解决方案1】:

只有列类型datetimeoffset 可以保存时区偏移量(例如您的问题中提到的-05:00)值。查看Data type mappings 文档以了解更多信息。

所以,如果要存储时区偏移值,请将列类型更改为datetimeoffset。之后,您将能够插入您在问题中提到的值。

您可以使用以下代码访问存储的值:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT foo FROM mytable WHERE ...");
while (rs.next()) {
   DateTimeOffset dateTimeOffset = rs.getObject(1, DateTimeOffset.class));
   System.out.println(dateTimeOffset);
} 
rs.close();
st.close();

其中foo是类型列的名称datetimeoffset

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2016-03-04
    • 2020-01-29
    • 2021-04-24
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多