2013-10-18 46 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语句。 –