添加天数到DateTime返回0的值?

时间:2014-09-23 16:26:25

标签: c# sql-server tsql datetime datetime-format

此代码计算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");
}

2 个答案:

答案 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列并编写代码以使用转换的日期值更新行。您可能需要协调此操作,修复应用程序中插入,更新和选择此字段的其他部分。

主要教训是:永远不要将日期视为字符串!这适用于除了表示层之外的应用程序的每个级别。