在我的代码中,我调用 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
问题是没有返回记录! DateAdded
是一个 smalldatetime
列。
当我将查询更改为以下内容时,它起作用了:
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)
高效地,通过优化器执行到范围的转换。
关于c# - Transact SQL 日期查询不返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10914245/