有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么是datetimeoffset列的正确DateTimeFormatter模式

通过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.

共 (1) 个答案

  1. # 1 楼答案

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

    Pattern letter 'X' (upper case) will output 'Z' when the offset to be output would be zero, whereas pattern letter 'x' (lower case) will output '+00', '+0000', or '+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
    

    注意:你的模式中也有一个输入错误,-介于ddHH之间