【问题标题】:datetime conversion to Java in SQLServer 2016SQLServer 2016 中的日期时间转换为 Java
【发布时间】: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


【解决方案1】:

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

ALTER TABLE SAJ.table DROP COLUMN myColumn;

ALTER TABLE SAJ.table ADD myColumndatetime2(3);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多