C#日期和时间比较

时间:2011-08-10 11:21:19

标签: c# sql

我有一个包含两列(start_timeend_time)的表。我从用户那里获取开始和结束时间的信息并将其添加到表中。一旦用户进入下一个开始和结束时间我必须将它与数据库进行比较。

假设在表格中,一行的开始时间为2011-08-10 16:00:00,结束时间为2011-08-10 16:30:00。 假设用户输入值2011-08-10 16:05:00.000start_time)和2011-08-10 16:25:00end_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();
                            }
                        }  

以下是我想要阻止的一些示例重叠

  1. 2011-08-10 15:55:00和end_time 2011-08-10 16:05:00的start_time(与现有数据重叠5分钟)

  2. 2011-08-10 16:25:00和end_time 2011-08-10 17:00:00的start_time(与现有数据重叠5分钟)

  3. 2011-08-10 15:00:00和end_time 2011-08-10 17:00:00的start_time(与现有数据重叠30分钟)

  4. 任何人都可以帮我解决这三个问题。

4 个答案:

答案 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();
            }
        }
    }
}

它正在做同样的事情:

  1. 使用参数而不是直接注入文本来防止可能的SQL注入攻击。
  2. 使用它们后处理对象(命令和阅读器),以防止连接保持打开状态并使数据库崩溃。这是由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;
    }