SQL Server 2016 中日期时间转换为 Java

datetime conversion to Java in SQLServer 2016

我有一个 table 的场景,它有一个带有日期时间 属性 的日期字段。

在文档中 (https://docs.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver15) :

请注意,java.sql.Timestamp 值不能再用于比较从 SQL Server 2016 开始的日期时间列中的值。此限制是由于服务器端更改将日期时间转换为 datetime2不同的是,导致非 equitable 值。此问题的解决方法是将日期时间列更改为 datetime2(3),使用字符串而不是 java.sql.Timestamp,或者将数据库兼容级别更改为 120 或更低。

我删除了时间戳的使用,尝试了其他解决方案,但 none 有效。

有人可以指出与此场景相关的任何文档或文章吗?

CarDAO :

String sql = "select c.car, c.color,\n" +
             "FROM car c\n"
             "WHERE c.createdAt BETWEEN :start and :end";

MapSqlParameterSource params = new MapSqlParameterSource("start", '2021-08-01');
params.addValue("end",'2021-08-10');

return templateMap.entrySet()
                .stream()
                .map(entry -> {
                    NamedParameterJdbcTemplate template = entry.getValue();
                    return template.query(sql, params, (rs, i) -> this.mapCar(rs, entry.getKey()));
                }).flatMap(Collection::stream)
                .collect(Collectors.toList());

地图车

LocalDateTime createdAt= rs.getTimestamp("createdAt ").toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    
Car.CarBuilder = Car.build()
[...]
.createdAt(createdAt)

return builder.build();

生成堆栈

 Implicit cast from varchar data type to timestamp is not allowed. Use the CONVERT function to run this query.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Implicit cast from varchar data type to timestamp is not allowed. Use the CONVERT function to run this query.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: A conversão implícita do tipo de dados varchar em timestamp não é permitida. Use a função CONVERT para executar essa consulta.
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:90)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:654)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:688)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:715)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:765)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192)

尝试使用 Date 和 LocalDateTime 的其他解决方案但没有成功,任何人都可以分享他们如何在他们的实施中解决这个问题。

编辑:

public class Car { [...] private final LocalDateTime createdAt; }

解决方案是将日期列更改为 datetime2(3),我想通过应用程序绕过它,但鉴于需要,更改是通过数据库进行的。

更改TABLE SAJ.table 删除列 myColumn;

更改 TABLE SAJ.table 添加 myColumndatetime2(3);