繁体   English   中英

相同的查询在 SQL 服务器客户端和 JDBC 客户端中提供不同的结果

[英]Same query provides different results in SQL Server client and JDBC client

我在我的项目中使用 SQL 服务器,我正在尝试检索两个时间戳之间的表中的条目。 该表的架构如下所示:

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 客户端上执行此查询时,我得到了所有预期的结果。 但是当我从 Java JDBC 客户端执行相同的查询时, resultset集中包含 ADDED_TIME 等于参数 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_TIME1606977788583的条目。 只有当我使用 Java JDBC 客户端执行它时才会返回它。 这可能是什么原因。

感谢您对此的任何帮助,

JDBC Java客户端给出不同结果的原因是:

SQL Server中有两种数据类型支持日期时间格式:

  1. 约会时间
  2. 日期时间2

ADDED_TIME列的数据类型是 DATETIME。 但是当使用PreparedStatement.setTimestamp()设置参数时,参数会隐式映射到DATETIME2类型。 使用setTimestamp()方法时,似乎无法将其设置为DATETIME类型。 这也在 [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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM