c# - Transact SQL 日期查询不返回任何结果

标签 c# sql sql-server-2008 tsql datetime

在我的代码中,我调用 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/

相关文章:

c# - 排行榜,排名查询,如何返回高于/低于用户排名的行

c# - 只有一个消费者从 RabbitMQ 上的队列接收消息

c# - 如何打开一个新的独立窗体?

sql - 在 Sql 服务器表变得丑陋之前,我可以在其中存储多少条记录?

c# - 3D 立方体绕 x 和 y 轴旋转

mysql - 是否可以在列大小不匹配的情况下创建外键

mysql - sql无法显示列的起始值中唯一的字符串值

SQL Server 加入临时表需要很长时间

sql - 为数据表中的每一行选择 COUNT(foreign ID)

sql-server-2008 - 如何将用作时间的 5 位 INT 转换并显示为 HH :MM:SS in SQL