从我的代码中,我使用以下命令调用SP:

using (var cmd = new SqlCommand("sp_getnotes"))
{
  cmd.Parameters.Add("@ndate", SqlDbType.SmallDateTime).Value
                  = Convert.ToDateTime(txtChosenDate.Text);
  cmd.CommandType = commandType;
  cmd.Connection  = conn;

  var dSet = new DataSet();
  using (var adapter = new SqlDataAdapter { SelectCommand = cmd })
  {
    adapter.Fill(dSet, "ntable");
  }
}


存储过程本身运行一个简单的查询:

SELECT * FROM tblNotes WHERE DateAdded = @ndate


问题是没有记录返回! DateAddedsmalldatetime列。

当我将查询更改为以下内容时,它将起作用:

SELECT * FROM tblNotes WHERE CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, DateAdded))) = @ndate


为什么会这样呢?这项更改会影响整个应用程序,我想在更改每个查询之前找到根本原因...我们所做的唯一更改是使用参数化查询并从SQL Server 2005升级到2008。

TIA。

最佳答案

smalldatetime的时间部分也需要匹配。

用这个:

SELECT  *
FROM    tblNotes
WHERE   dateAdded >= CAST(@ndate AS DATE)
        AND dateAdded < DATEADD(day, 1, CAST(@ndate AS DATE))


SQL Server 2008及更高版本还允许您使用此功能:

SELECT  *
FROM    tblNotes
WHERE   CAST(dateAdded AS DATE) = CAST(@ndate AS DATE)


有效地转换到优化器执行的范围。

10-04 21:37