3

从我的代码中,我使用以下命令调用 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。

4

3 回答 3

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)

高效地转换为优化器执行的范围。

于 2012-06-06T12:33:43.080 回答
1

SQL Server 2008 现在有一个 DATE 数据类型,它不像 SMALLDATETIME 那样保留时间部分。如果您无法更改列的数据类型,则在进行比较时必须截断,或者简单地转换为 DATE:

SELECT  * 
FROM    tblNotes 
WHERE   cast(dateAdded as date) = @ndate 
于 2012-06-06T12:40:04.737 回答
0

我不知道 SQL Server,但根据 Oracle 的经验,我怀疑您正在将日期时间与日期进行比较,例如 01/01/2012 01:01:01 与 01/01/2012。

于 2012-06-06T12:36:59.740 回答