Каков правильный шаблон DateTimeFormatter для столбца datetimeoffset

Каков правильный шаблон DateTimeFormatter для запроса таблицы SQL Server по столбцу datetimeoffset. Когда я выполняю запрос ниже, я получаю результаты. Какой правильный шаблон я должен использовать для выполнения того же запроса из 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.

1 ответ

Вам нужно использовать узор, 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, в вашем шаблоне.

Другие вопросы по тегам