从我的代码中,我使用以下方法调用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。
答案 0 :(得分:5)
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)
有效,转换到优化器执行的范围。
答案 1 :(得分:1)
SQL Server 2008现在有一个DATE数据类型,它不像SMALLDATETIME那样保留时间。如果您无法更改列的数据类型,那么您在进行比较时必须截断,或者只是转换为DATE:
SELECT *
FROM tblNotes
WHERE cast(dateAdded as date) = @ndate
答案 2 :(得分:0)
我不知道SQL Server,但是从Oracle的经验来看,我怀疑你是在将日期时间与日期进行比较,例如01/01/2012 01:01:01与01/01/2012。