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

use*_*775 2 c# t-sql sql-server datetime datetime-format

此代码计算MSSQL表中的记录数,其中日期介于今天的日期和今天的日期+ 8天之间,但它不起作用; 它返回一个值0,但是2正确的答案.

如果我更改DateTime.Now.AddDays7以下它的作品,因为它应该.

//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");
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 12

不要将日期/时间视为字符串.只是:

command.Parameters.AddWithValue("@date", DateTime.Now);
command.Parameters.AddWithValue("@dateadd", DateTime.Now.AddDays(8));
Run Code Online (Sandbox Code Playgroud)

问题可能是日期/时间格式.

请注意,您实际上是无缘无故地执行了两次; 你可以删除command.ExecuteNonQuery().

最后,不要将整数视为字符串:

int count = (int)command.ExecuteScalar();
if(count != 0)  { .... }
Run Code Online (Sandbox Code Playgroud)

  • @user作为一个声明几乎没用.怎么了?它与你期望发生的事情有什么不同?如果你得到一个不同的数字:是什么让你认为你的期望是正确的?(如果您经常将数据视为字符串,坦率地说,源数据非常可疑).列的数据类型是什么? (2认同)

Joe*_*orn 8

从现在开始的七天,它仍然是九月,日期如下:

30/09/2014

从现在开始的8天,是10月,日期如下:

2014年1月10日

流行测验:是01/10/2014指10月1日还是1月10日?显然,你的意思是它指的是10月1日,但是世界上的部分地区(可能是Sql Server)会将其读作1月10日.

这里的解决方案是你不应该将日期参数作为字符串传递!.ToString()完全删除调用可能足以在这种情况下修复它,但我更喜欢明确我的数据库类型:

command.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Today;
command.Parameters.Add("@dateadd", SqlDbType.DateTime).Value = DateTime.Today.AddDays(8);
Run Code Online (Sandbox Code Playgroud)

当然,上面的修复假定您已经在数据库中完成了理智的事情.您可能错误地将日期存储为varchar字段.如果你这样做,SQL Server在比较你的领域为字符串,并根据您的示例格式事情早在一个月中总是会在本月稍后日期之前,甚至在不同的月份进行排序.这意味着,你的榜样结束日期来到之前开始日期.如果这是您的问题,则需要向表中添加新的Date列并编写代码以使用转换的日期值更新行.您可能需要协调此操作,修复应用程序中插入,更新和选择此字段的其他部分.

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