0

通过 datetimeoffset 列查询 SQL Server 表的正确 DateTimeFormatter 模式是什么。当我执行以下查询时,我得到了结果。我应该使用什么正确模式从 Java 应用程序运行相同的查询?

SELECT *
FROM
       TABLE
WHERE
       CreateTimestamp >= '2020-07-06 06:00:00.0000000 +00:00'

下面是我用来转换日期的 java 代码片段:

public String convertToDatabaseColumn(OffsetDateTime offsetDateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS Z");
        return offsetDateTime.format(formatter);
    }

下面是设置参数并执行查询的片段

Date beginDt; // passed to the method as parameter
Date endDt; // passed to the method as parameter
OffsetDateTime beginDateTime = beginDt.toInstant().atOffset(ZoneOffset.UTC);
OffsetDateTime endDateTime = endDt.toInstant().atOffset(ZoneOffset.UTC);
params.put(BEG, convertToDatabaseColumn(beginDateTime));
params.put(END, convertToDatabaseColumn(endDateTime));
List<Map<String, Object>> newfuelList = sqlJdbcTemplate.queryForList(sqlForNewFuel, params);

我得到以下异常

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting date and/or time from character string.
4

1 回答 1

2

您需要使用模式,yyyy-MM-dd HH.mm.ss.SSSSSS xxx. 从DateTimeFormatter的文档中检查以下句子:

当要输出的偏移量为零时,模式字母“X”(大写)将输出“Z”,而模式字母“x”(小写)将输出“+00”、“+0000”或“+00” :00'。

演示:

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(
                convertToDatabaseColumn(OffsetDateTime.of(LocalDateTime.of(2020, 7, 6, 6, 0, 0, 0), ZoneOffset.UTC)));
    }

    public static String convertToDatabaseColumn(OffsetDateTime offsetDateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH.mm.ss.SSSSSS xxx");
        return offsetDateTime.format(formatter);
    }
}

输出:

2020-07-06 06.00.00.000000 +00:00

注意:您的模式中还有一个错字,-介于dd和之间HH

于 2020-11-09T23:03:17.577 回答