使用sql和c#查找存储在数据库中的两个时间之间的时间差

本文关键字:两个 时间差 之间 时间 sql 查找 存储 数据库 使用 | 更新日期: 2023-09-27 18:25:29

string sqlUserName3 = "SELECT out_date FROM status where s_id='" + TextBox2.Text + "'";
SqlCommand sqlcmd3 = new SqlCommand(sqlUserName3, sqlcon);

sqlUserName4 = "SELECT in_date FROM status where s_id='"+TextBox2.Text+"'";
SqlCommand sqlcmd4 = new SqlCommand(sqlUserName4, sqlcon);
string q3 = sqlcmd3.ExecuteNonQuery().ToString();
string q4 = sqlcmd4.ExecuteNonQuery().ToString();
DateTime dt1 = DateTime.Parse(q3);
DateTime dt2 = DateTime.Parse(q4);
TimeSpan result = dt1.Subtract(dt2);
string result1 = result.ToString();
TextBox8.Text = result1;

//Response.Redirect("login.aspx");
sqlcon.Close();

使用sql和c#查找存储在数据库中的两个时间之间的时间差

目前您的代码有很多错误:

  • 您不应该使用字符串串联来构建查询。请改用参数化SQL。这将避免SQL注入攻击和转换问题
  • 当您尝试执行时,您正在使用ExecuteNonQuery。。。查询
  • 您正在将结果转换为字符串,这是一个坏主意,即使确实返回了日期。。。相反,以DateTime的形式获取结果。尽可能避免字符串转换

所以你应该:

  • 使用参数而不是动态SQL
  • 使用ExecuteReader并从每个读取器获得第一个结果
  • 使用GetDateTime方法从结果中得到DateTime

之后我个人也会使用减法运算符:

TimeSpan difference = end - start;

但这只是一个偏好问题,而不是当前代码中实际的错误

您的错误在这里:

string q3 = sqlcmd3.ExecuteNonQuery().ToString();
string q4 = sqlcmd4.ExecuteNonQuery().ToString();
DateTime dt1 = DateTime.Parse(q3);
DateTime dt2 = DateTime.Parse(q4);

ExecuteNonQuery不以字符串表示形式返回日期。它返回受查询影响的记录数;因此,当您运行DateTime.Parse(number)时,您会得到一个错误。

您的查询都没有返回日期,因此不清楚如何通过调用问题中的SQL来返回日期。。。

更新

不要使用字符串串联来构建SQL语句。您可以使用参数来避免暴露于SQL注入攻击。一个例子是:

string sqlUserName3 = "SELECT out_date FROM status where s_id=@id";
SqlCommand sqlcmd3 = new SqlCommand(sqlUserName3, sqlcon);
sqlcmd3.Parameters.AddWithValue("@id",TextBox2.Text );

您使用SqlCommand.ExecuteNonQuery(),但需要SqlCommand.ExecuteScalar()。第一个函数什么也不返回,它应该用于insertupdate之类的查询。第二个返回查询输出的第一行的第一个单元格的值。

您应该使用execute标量或传递一些out参数来获取值。这应该会让你在q3和q4中得到一些值。

现在为了避免错误,您还应该使用DateTime.ParseExact而不是简单的Parse。

DateTime dt1 = DateTime.ParseExact(q3,"dd/mm/yyyy HH:mm",CultureInfo.InvariantCulture);
DateTime dt2 = DateTime.ParseExact(q4,"dd/mm/yyyy HH:mm",CultureInfo.InvariantCulture);