【发布时间】:2021-08-25 18:12:26
【问题描述】:
我有一个表,其中有一个带有 datetime 属性的日期字段。
在文档中 (https://docs.microsoft.com/en-us/sql/connect/jdbc/using-basic-data-types?view=sql-server-ver15):
请注意,java.sql.Timestamp 值不能再用于比较从 SQL Server 2016 开始的 datetime 列中的值。此限制是由于服务器端更改以不同方式将 datetime 转换为 datetime2,导致非公平的价值观。此问题的解决方法是将 datetime 列更改为 datetime2(3),使用 String 而不是 java.sql.Timestamp,或者将数据库兼容级别更改为 120 或以下。
我删除了时间戳的使用,尝试了其他解决方案,但没有一个有效。
有人能指出与此场景相关的任何文档或文章吗?
汽车道:
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; }
【问题讨论】:
-
使用 CONVERT 函数运行此查询你做到了吗?
-
我需要在生产场景中保持与 SQLServer、Oracle 和 DB2 数据库的兼容性。 :(
-
CAST理论上是可移植的。试试看 -
@MuriloEduardo - 您使用此代码的列的类型(日期时间/日期时间2/字符串)是什么?
-
@ArvindKumarAvinash,我在专栏中使用了日期时间。
标签: java date sql-server-2016 spring-jdbc