此代码计算MSSQL表中的记录数,其中日期介于今天的日期和今天的日期之间+ 8天,但它不起作用;它返回0
的值,但2
是正确答案。
如果我将DateTime.Now.AddDays
更改为7
或更少,则可以正常工作。
//Ordre klar til bestilling
command.CommandText = "SELECT COUNT(*) from bestillinger WHERE udlevering BETWEEN @date and @dateadd";
command.Parameters.AddWithValue("@date", DateTime.Now.ToString("dd/MM/yyyy"));
command.Parameters.AddWithValue("@dateadd", DateTime.Now.AddDays(+8).ToString("dd/MM/yyyy"));
con.Open();
command.ExecuteNonQuery();
string result0 = command.ExecuteScalar().ToString();
con.Close();
MessageBox.Show(result0);
if (result0 != "0")
{
bestillingToolStripMenuItem.ForeColor = System.Drawing.ColorTranslator.FromHtml("#FF1919");
}
答案 0 :(得分:12)
不要将日期/时间视为字符串。只是:
command.Parameters.AddWithValue("@date", DateTime.Now);
command.Parameters.AddWithValue("@dateadd", DateTime.Now.AddDays(8));
问题可能是日期/时间格式。
请注意,您实际上是无缘无故地执行了两次;您可以删除command.ExecuteNonQuery()
。
最后,不要将整数视为字符串:
int count = (int)command.ExecuteScalar();
if(count != 0) { .... }
答案 1 :(得分:8)
从现在开始的七天,它仍然是九月,日期看起来像这样:
30/09/2014
从现在开始的八天,是十月,日期如下:
2014年1月10日
流行测验:01/10/2014
是指10月1日还是1月10日?显然,你的意思是指10月1日,但世界上的部分地区(可能是Sql Server)将把它读作1月10日。
此处的解决方案是您不应将日期参数作为字符串传递!完全删除.ToString()
调用可能足以在这种情况下修复它,但{{3} }:
command.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Today;
command.Parameters.Add("@dateadd", SqlDbType.DateTime).Value = DateTime.Today.AddDays(8);
当然,上面的修补程序假设您在数据库中完成了理智的事情。您可能错误地将日期存储为varchar字段。如果您这样做,Sql Server会将您的字段作为字符串进行比较,并根据您的示例格式,本月初的任何内容始终将在月份之后的日期之前进行排序,即使是在不同的月份。这意味着您的示例结束日期是之前的开始日期。如果这是您的问题,则需要向表中添加新的Date列并编写代码以使用转换的日期值更新行。您可能需要协调此操作,修复应用程序中插入,更新和选择此字段的其他部分。
主要教训是:永远不要将日期视为字符串!这适用于除了表示层之外的应用程序的每个级别。