【问题标题】:Get the return value of date diff?获取日期差异的返回值?
【发布时间】:2017-11-28 14:31:03
【问题描述】:

所以我在 MS SQL Server 上使用 DATEDIFF 函数进行此查询?

SELECT DATEDIFF(DAY,(select StartDate from CarOrder where OrderID= 59),(select EndDate from CarOrder where OrderID= 59))

这工作正常,结果为 10,但我不知道如何获取返回值并将其用于 java 的此函数中

public int getDateDiff(int OrderID){
    Connection conn = DBConnection.getConnection();
    int datediff;
    String getdiffSQL = "SELECT DATEDIFF(DAY,(select StartDate from CarOrder where OrderID = ? ) ,(select EndDate from CarOrder where OrderID= ?) )";
    try {
        PreparedStatement pstm = conn.prepareStatement(getdiffSQL);
        pstm.setInt(1, OrderID);
        pstm.setInt(2, OrderID);            
        int nRows = pstm.executeUpdate();
        return nRows;
    } catch (SQLException ex) {
        System.out.println("Error: " + ex.getMessage());
    } finally {
        DBConnection.closeConnection(conn);
    }

}

我希望它返回日期差异编号,以便它是我可以在 java 中使用的变量,我该怎么做? 谢谢。

【问题讨论】:

  • 你能澄清一下你上面的代码有什么问题吗?
  • 没有任何问题,我只需要从 datediff 获取返回值,并将其变成我可以在 java 中使用的变量。
  • 与您的问题无关,但查询会更好SELECT DATEDIFF(DAY,StartDate,EndDate) FROM CarOrder WHERE OrderID = ?
  • 当您的 SQL 不代表更新时,您为什么要调用 executeUpdate?我认为这是问题的核心......

标签: java sql-server return datediff


【解决方案1】:

将查询结果存储在 ResultSet 对象中,然后使用 {YOUR_RESULT_SET}.getYourDataType(columnNumber) 选择相应列的值。

【讨论】:

    【解决方案2】:

    使用ResultSet

    您需要捕获ResultSet,并访问该ResultSet 的行(在本例中为单行)。如果您正在执行查询,请在您的PreparedStatement 上调用executeQuery,从而生成ResultSet

    使用现代try-with-resources 语法自动关闭您的数据库资源。您可以删除 finally 子句;无需在您的数据库资源上调用 closeXXX,因为该杂务已为您处理。

    没有尝试过执行以下代码示例,但我希望它接近您的需要。我正在使用Martin Smith 评论中建议的备用SELECT 行;我没有考虑过,因为这不是您问题的核心。

    String sql = "SELECT DATEDIFF( DAY , StartDate , EndDate ) FROM CarOrder WHERE OrderID = ? ;" ;
    
    Integer diff = null ;
    try ( 
            Connection conn = myDataSource.getConnection() ;
            PreparedStatement pstmt = conn.prepareStatement ( sql ) ; 
        ) {
            pstmt.setInt( 1 , orderId ) ; 
            try ( 
                ResultSet rs = pstmt.executeQuery( sql ) ;
            ) {
                while ( rs.next ( ) ) {
                    diff = rs.getInt( 1 ) ;  // Auto-boxing `int` to `Integer`.
                }
            }
        }
    } catch ( SQLException e ) {
        e.printStackTrace ( );  // Handle error condition however you see fit.
    }
    
    if( null == diff ) {
        System.out.println( "mission failed." ) ;
    } else {
        System.out.println( "mission succeeded. Diff is: " + diff ) ;
    }
    

    对于实际工作,我还会进行测试以确保只返回一行(确保 while 循环只运行一次,而不是零次或多次)。

    如果您对各种数据库资源(DataSource、Connection、PreparedStatement、ResultSet)不清楚,您应该放下IDE 并多研究Oracle Tutorial on JDBC matters,并进行一些搜索/研究Stack Overflow 上的主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2017-04-04
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      相关资源
      最近更新 更多