C# C日期和时间比较
我有一个包含两列开始时间和结束时间的表。我从用户那里获取开始和结束时间的信息,并将其添加到表中。一旦用户输入下一个开始和结束时间,我必须将其与数据库进行比较 假设在表中,一行的开始时间为2011-08-10 16:00:00,结束时间为2011-08-10 16:30:00。 假设用户输入值2011-08-10 16:05:00.000开始时间和2011-08-10 16:25:00结束时间,我可以使用C# C日期和时间比较,c#,sql,C#,Sql,我有一个包含两列开始时间和结束时间的表。我从用户那里获取开始和结束时间的信息,并将其添加到表中。一旦用户输入下一个开始和结束时间,我必须将其与数据库进行比较 假设在表中,一行的开始时间为2011-08-10 16:00:00,结束时间为2011-08-10 16:30:00。 假设用户输入值2011-08-10 16:05:00.000开始时间和2011-08-10 16:25:00结束时间,我可以使用 String getConflictTimeInBetween = string
String getConflictTimeInBetween = string.Format("select question_id,question_text from " + data_variables.RES_TXT_STRING_QUESTION_TABLE + " where start_time<='{0}' and end_time>='{1}'", start_full, end_full);//question_text='DFS'"2011-06-23 14:55);//
com = new SqlCommand(getConflictTimeInBetween, myConnection);
dr = com.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
//Assign to your textbox here
conflictQuestionIdAtBetween = dr["question_id"].ToString();
conflictQuestionTextAtBetween=dr["question_text"].ToString();
}
}
下面是一些我想要防止的示例重叠
开始时间从2011-08-10 15:55:00到结束时间2011-08-10 16:05:00与现有数据重叠五分钟
开始时间从2011-08-10 16:25:00到结束时间2011-08-10 17:00:00与现有数据重叠五分钟
开始时间从2011-08-10 15:00:00到结束时间2011-08-10 17:00:00 30分钟与现有数据重叠
有人能帮我解决这三个问题吗。我相信,要使日期范围正确相交,您需要做的是:
String getConflictTimeInBetween = string.Format("select question_id,question_text from " + data_variables.RES_TXT_STRING_QUESTION_TABLE + "where (start_time<='{0}' and end_time>='{0}') or ((start_time<='{1}' and end_time>='{1}')", start_full, end_full);
不确定您的问题是什么意思,但这里有更好的代码:
String getConflictTimeInBetween = string.Format("select question_id,question_text from {0} where start_time<=@start and end_time>=@end", data_variables.RES_TXT_STRING_QUESTION_TABLE);
using (com = new SqlCommand(getConflictTimeInBetween, myConnection))
{
com.Parameters.AddWithValue("@start", Convert.ToDateTime(start_full));
com.Parameters.AddWithValue("@end", Convert.ToDateTime(end_full));
using (dr = com.ExecuteReader())
{
if (dr.HasRows)
{
while (dr.Read())
{
//Assign to your textbox here
conflictQuestionIdAtBetween = dr["question_id"].ToString();
conflictQuestionTextAtBetween=dr["question_text"].ToString();
}
}
}
}
它也在做同样的事情,另外:
通过使用参数而不是直接注入文本来防止可能的SQL注入攻击。
在使用对象命令和读取器后,请处置它们,以防止连接保持打开状态并使数据库崩溃。这是通过使用块来完成的。
您提到的3个重叠场景中没有一个会显示在您现在使用的查询中。从你的帖子中不清楚你想要实现什么,但我可以给你一些查询,这些查询将显示每个场景:
1从+data_variables.RES_TXT_STRING_question_TABLE+中选择question_id,question_text,其中start_time>'{0}'和start_time'{0}'和end_time,因为您似乎有SQL部分,所以下面的算法可以找到输入时间和行时间之间的重叠
public long GetTimeOverlap(long inputStart, long inputEnd)
{
// I assume you can get the data yourself so heres only the algorithm.
long rowStart = new DateTime().Ticks, rowEnd = new DateTime().Ticks;
if (inputStart < rowStart)
if (inputEnd >= rowEnd)
// case 3
return rowEnd - rowStart;
else if (inputEnd > rowStart)
// case 1
return inputEnd - rowStart;
// Input time is before row time.
else return 0;
else if (inputStart >= rowEnd)
// Input time is after row time.
return 0;
else if (inputEnd >= rowEnd)
// case 2
return rowEnd - inputStart;
// case 0
else return inputEnd - inputStart;
}
这是微不足道的。请提供您尝试过的内容,并解释为什么不起作用。我认为您使用了错误的术语。您的意思是要防止在同一时间范围内发生重复/重叠数据?是否要查看重叠?您是否只想在开始和结束之间获取时间?在这种情况下,您最终将有一个只有1分钟的时间框架,您希望实现什么?我不希望在开始时间和结束时间之间有任何重叠。我知道我提供的上述内容不适用于这3个问题。但如何处理这3个问题。u提供的3个查询都是相同的。如何捕获它。如果再加上我的3个查询和他的查询,他将从数据库中获取大量数据,并在客户端进行计算。如果我是他,我会用一个更好的查询让数据库来计算。尽管如此,这仍然是一种选择。