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);
我有一个 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);