SQL DateDiff不一致

时间:2013-10-18 13:48:41

标签: c# winforms

当我在我的SQL数据库(来自管理工作室)上运行以下脚本时,我得到了我期望的结果 -

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所需的代码并且已经工作了数百次,所以我怀疑问题是存在的。

2 个答案:

答案 0 :(得分:1)

感谢allo-man,使用参数。

最终代码如下 -

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);
        }
    }

答案 1 :(得分:0)

你最好使用参数,但这里的问题是

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

你需要单引号