簡體   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