使用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。这将避免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()
。第一个函数什么也不返回,它应该用于insert
或update
之类的查询。第二个返回查询输出的第一行的第一个单元格的值。
您应该使用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);