我有一个包含两列(start_time
和end_time
)的表。我从用户那里获取开始和结束时间的信息并将其添加到表中。一旦用户进入下一个开始和结束时间我必须将它与数据库进行比较。
假设在表格中,一行的开始时间为2011-08-10 16:00:00
,结束时间为2011-08-10 16:30:00
。
假设用户输入值2011-08-10 16:05:00.000
(start_time
)和2011-08-10 16:25:00
(end_time
)我可以使用
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
和end_time 2011-08-10 16:05:00
的start_time(与现有数据重叠5分钟)
2011-08-10 16:25:00
和end_time 2011-08-10 17:00:00
的start_time(与现有数据重叠5分钟)
2011-08-10 15:00:00
和end_time 2011-08-10 17:00:00
的start_time(与现有数据重叠30分钟)
任何人都可以帮我解决这三个问题。
答案 0 :(得分:1)
您提到的3个重叠方案中没有一个会显示您正在使用的查询。从你的帖子中不清楚你的意思是什么,但我可以给你一些显示每个场景的查询:
1)“从”+ data_variables.RES_TXT_STRING_QUESTION_TABLE +“中选择question_id,question_text,其中start_time&gt;'{0}'和start_time&lt;'{1}'”,start_full,end_full); // question_text ='DFS'“2011 -06-23 14:55);
2)“从”+ data_variables.RES_TXT_STRING_QUESTION_TABLE +“中选择question_id,question_text,其中end_time&gt;'{0}'和end_time&lt;'{1}'”,start_full,end_full); // question_text ='DFS'“2011 -06-23 14:55);
3)“从”+ data_variables.RES_TXT_STRING_QUESTION_TABLE +“中选择question_id,question_text,其中start_time&gt;'{0}'和end_time&lt;'{1}'”,start_full,end_full); // question_text ='DFS'“2011 -06-23 14:55);
答案 1 :(得分:0)
我相信你想要做的就是正确地交叉日期范围是这样的:
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);
答案 2 :(得分:0)
不确定您在问题中的意思,但是这里有更好的代码:
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();
}
}
}
}
它正在做同样的事情:
using
块完成的。答案 3 :(得分:0)
由于您似乎拥有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;
}