java—同一查询在sql server客户端和jdbc客户端中提供不同的结果

tgabmvqs  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(405)

我在我的项目中使用sqlserver,我试图在两个时间戳之间的表中检索条目。下表所示为:

CREATE TABLE ENTRY (
    ID INTEGER IDENTITY(1,1) NOT NULL,
    NAME VARCHAR (2000),
    USER_ID VARCHAR (31) NOT NULL,
    ADDED_TIME DATETIME NOT NULL
);

我需要获取在特定时间戳和当前时间戳之后添加的条目。为此,我尝试了以下查询:

SELECT * FROM ENTRY WHERE
ADDED_TIME>$parameter1 AND ADDED_TIME<$currentTime ORDER BY ADDED_TIME DESC

SELECT * FROM ENTRY WHERE
ADDED_TIME>'12/03/2020 12:13:08.583' AND ADDED_TIME<'12/03/2020 13:36:05.159' ORDER BY ADDED_TIME DESC

当直接在sql客户机上执行这个查询时,我得到了所有预期的结果。但是当我从javajdbc客户机执行相同的查询时 resultset 包含添加了等于参数1的时间的条目。
以下是客户端的java代码:

String sql = "SELECT * FROM ENTRY WHERE ADDED_TIME>? AND ADDED_TIME<? ORDER BY ADDED_TIME DESC";
Date to = new Date();
PreparedStatement statement = conn.prepareStatement(sql);
statement.setTimestamp(1, new Timestamp(Long.parseLong("1606977788583")));
statement.setTimestamp(2, new Timestamp(to.getTime()));
ResultSet results = statement.executeQuery();

结果集包含的条目 ADDED_TIME 作为 1606977788583 . 只有使用javajdbc客户机执行它时才会返回。可能的原因是什么。
感谢你的帮助,

kognpnkq

kognpnkq1#

jdbc java客户机给出不同结果的原因是:
在sql server中,有两种数据类型支持日期时间格式:
日期时间
日期时间2
列的数据类型 ADDED_TIME 是日期时间。但是在使用 PreparedStatement.setTimestamp() 参数隐式地Map到datetime2类型。使用时似乎无法将其设置为datetime类型 setTimestamp() 方法。[1]中也讨论了这一点。
通过如下更正查询来修复此问题:

String sql = "SELECT * FROM ENTRY WHERE 
              ADDED_TIME> CONVERT(DATETIME, ?) AND 
              ADDED_TIME< CONVERT(DATETIME, ?) 
              ORDER BY ADDED_TIME DESC";

[1] https://github.com/microsoft/mssql-jdbc/issues/443

相关问题