Сравнение даты и времени в C # - PullRequest
0 голосов
/ 10 августа 2011

У меня есть таблица, которая содержит два столбца (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();
                            }
                        }  

Вот некоторые примеры перекрытий, которые я хочу предотвратить

  1. start_time с 2011-08-10 15:55:00 и end_time 2011-08-10 16:05:00 (пять минут перекрываются с уже существующими данными)

  2. start_time с 2011-08-10 16:25:00 и end_time 2011-08-10 17:00:00 (пять минут перекрываются с уже существующими данными)

  3. start_time с 2011-08-10 15:00:00 и end_time 2011-08-10 17:00:00 (30 минут перекрываются с уже существующими данными)

Может кто-нибудь помочь мне, как решить эти три проблемы.

Ответы [ 4 ]

1 голос
/ 10 августа 2011

Ни один из 3-х перекрывающихся сценариев, которые вы упомянули, не будет отображаться с запросом, который вы используете сейчас. Из вашего поста неясно, что вы хотите достичь, но я могу дать вам вопросы, которые покажут каждый сценарий:

1) "выберите question_id, question_text из" + data_variables.RES_TXT_STRING_QUESTION_TABLE + ", где start_time> '{0}' и start_time <'{1}'", start_full, end_full); // question_text = 'DFS' '2011 -06-23 14:55); </p>

2) "выберите question_id, question_text из" + data_variables.RES_TXT_STRING_QUESTION_TABLE + "где end_time> '{0}' и end_time <'{1}'", start_full, end_full); // question_text = 'DFS' '2011 -06-23 14:55); </p>

3) "выберите question_id, question_text из" + data_variables.RES_TXT_STRING_QUESTION_TABLE + "где start_time> '{0}' и end_time <'{1}'", start_full, end_full); // question_text = 'DFS' '2011 -06-23 14:55); </p>

0 голосов
/ 10 августа 2011

Поскольку у вас, кажется, есть часть 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;
    }
0 голосов
/ 10 августа 2011

Не уверен, что вы имеете в виду в своем вопросе, но вот гораздо лучший код:

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.
0 голосов
/ 10 августа 2011

Я считаю, что вы хотите сделать, чтобы правильно пересечь диапазоны дат, что-то вроде:

   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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...