相同的查询在 SQL 服务器客户端和 JDBC 客户端中提供不同的结果
Same query provides different results in SQL Server client and JDBC client
我在我的项目中使用 SQL 服务器,我试图在两个时间戳之间检索 table 中的条目。 table 的架构如下:
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 等于 parameter1.
的条目
这里是客户端的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
的条目。只有当我使用 Java JDBC 客户端执行它时才会返回它。这可能是什么原因。
感谢任何帮助,
JDBC Java 客户端给出不同结果的原因是:
SQL服务器中有两种数据类型支持日期时间格式:
- 日期时间
- DATETIME2
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";
我在我的项目中使用 SQL 服务器,我试图在两个时间戳之间检索 table 中的条目。 table 的架构如下:
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 等于 parameter1.
这里是客户端的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
的条目。只有当我使用 Java JDBC 客户端执行它时才会返回它。这可能是什么原因。
感谢任何帮助,
JDBC Java 客户端给出不同结果的原因是:
SQL服务器中有两种数据类型支持日期时间格式:
- 日期时间
- DATETIME2
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";