2013-10-18 72 views
0

當我在我的SQL數據庫上運行以下腳本(從管理工作室)我得到的結果,我希望 -SQL則DateDiff不一致

SELECT * 
FROM [Case] 
WHERE ABS((DATEDIFF(DAY, [DateAccident], '2013-01-01'))) < 100; 

當我增加/減少值100,我得到更多/更少完全符合預期。

然而,當我試圖從我的WinForms應用程序產生相同的結果(在C#)我得到的遠遠的結果比我要 -

public static DataTable DOACases(DateTime doa, int days) 
{ 
    try 
    { 
     DataTable table = new DataTable(); 
     string sqlText = "SELECT * " + 
         "FROM [Case] " + 
         "WHERE ABS((DATEDIFF(DAY, [DateAccident], " + doa.ToString().Substring(0,10) + "))) < " + days.ToString() + ";"; 
     SqlCommand sqlCom = new SqlCommand(sqlText); 
     table = Express.GetTable(sqlCom); 
     return table; 
    } 
    catch (Exception eX) 
    { 
     throw new Exception("Case: DOACases(Date)" + Environment.NewLine + eX.Message); 
    } 
} 

我不知道爲什麼

PS。 Express.GetTable(sqlCom)只是在數據庫上創建一個連接,並使用DataReader填充DataTable所需的代碼,並且已經工作了數百次,所以我懷疑問題出在那裏。

+6

你看着查詢。日期格式是否正確(yyyy-MM-dd?)。您應該使用SqlParameters –

+0

Doa變量是否包含時間分量?這是拋棄了結果嗎? – rsbarro

+2

除了使用參數外,還應該使用範圍而不是'ABS(DATEDIFF),因此可以使用索引。 –

回答

1

由於異體人,使用參數的工作。

最終代碼看上去如下 -

public static DataTable DOACases(DateTime doa, int days) 
    { 
     try 
     { 
      DataTable table = new DataTable(); 
      string sqlText = "SELECT * " + 
          "FROM [Case] " + 
          "WHERE ABS((DATEDIFF(DAY, [DateAccident], @Date))) < @Days;"; 
      SqlCommand sqlCom = new SqlCommand(sqlText); 
      sqlCom.Parameters.Add("@Date", SqlDbType.Date).Value = doa; 
      sqlCom.Parameters.Add("@Days", SqlDbType.Int).Value = days; 
      table = Express.GetTable(sqlCom); 
      return table; 
     } 
     catch (Exception eX) 
     { 
      throw new Exception("Case: DOACases(Date)" + Environment.NewLine + eX.Message); 
     } 
    } 
0

您更好地使用參數,但這裏的問題是

'" + doa.ToString("yyyy-MM-dd" , CultureInfo.InvariantCulture) + "'

你需要使用單引號

+0

您甚至最好不要使用'String.Format'來創建您的SQL語句。 –