Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C日期和时间比较_C#_Sql - Fatal编程技术网

C# C日期和时间比较

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

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

假设在表中,一行的开始时间为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.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个查询和他的查询,他将从数据库中获取大量数据,并在客户端进行计算。如果我是他,我会用一个更好的查询让数据库来计算。尽管如此,这仍然是一种选择。