Как убедиться в отсутствии конфликта перед резервом

Пожалуйста, взгляните на изображение ниже.

Изображение1

и это мой образец БД.

Изображение2

Я хочу использовать запрос для проверки двух диапазонов дат (перекрывающихся), но не знаю, как это сделать. Моя идея состоит в том, чтобы выполнить этот код внутри или после того, как я нажму кнопку «Зарезервировать».

private void Btnreserve_Click(object sender, EventArgs e)
{
    // help
}

Помогите пожалуйста решить мою проблему, заранее большое спасибо.


У меня есть код, но он не работает должным образом. Если у вас есть идеи, это для меня большая помощь.

string DTimePicker = dtpckerDeliverDate.Value.ToString("yyyy-MM-dd HH:mm:ss tt");
MySqlCommand cmd1 = new MySqlCommand("""
    SELECT *
    FROM db_reserve_vehicle
    WHERE
        deliver_date=@deliver_date < pickup_date=@pickup_date &&
        pickup_date=@pickup_date < deliver_date=@deliver_date
    ORDER BY vehicle_Id = @vehicle_Id
    """, DBConnection.con); //check query
cmd1.Parameters.AddWithValue("@deliver_date", dt);
cmd1.Parameters.AddWithValue("@pickup_date", dt);
cmd1.Parameters.AddWithValue("@vehicle_Id", dt);

MySqlDataReader reader = cmd1.ExecuteReader();
reader.Read();
if (reader.HasRows < DTimePicker)
{
    MessageBox.Show("vehicle still reserve.");
}
else
{
    MessageBox.Show("you can insert");
}

«Я хочу использовать запрос для проверки двух диапазонов дат (перекрывающихся)» — см.: stackoverflow.com/questions/13513932/….

wohlstad 11.08.2024 14:04

Не предоставляйте дополнительную информацию, редактируя ответы других. Вместо этого отредактируйте свой вопрос.

Olivier Jacot-Descombes 12.08.2024 13:16

Оливье Жако-Декомб, Извините, сэр.

user26743691 12.08.2024 13:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы убедиться, что между двумя датами нет совпадения (потому что я предполагаю, что вы этого хотите), вы можете проверить

DateTime aStart = ...;
DateTime aEnd = ...;

DateTime bStart = ...;
DateTime bEnd = ...;

if (aEnd < bStart || aStart > bEnd) {
    // No conflict
} else {
    // Overlap!
}

Вместо этого вы также можете использовать <= и >=, если позволяете диапазонам соприкасаться.

Вы не предоставили нам никакого кода, поэтому я не могу сформулировать это с точки зрения ваших переменных, свойств и элементов управления.


Дополнительная информация, которую вы предоставили, полностью меняет вопрос. Вы выполняете проверку диапазона дат в SQL, а не в C#, и вам нужно знать, как получить запись из базы данных.

Ваша команда SQL неверна. Диапазоны дат задаются как [deliver_date .. Pickup_date]. Мы ищем конфликты. Поэтому мы должны инвертировать условие сверху: aEnd > bStart && aStart < bEnd. Как SQL:

SELECT id
FROM db_reserve_vehicle
WHERE
    vehicle_Id = @vehicle_Id AND
    pickup_date > @deliver_date AND
    deliver_date < @pickup_date
One of several situations where there is an overlap:

      deliver_date            pickup_date
           |-----------------------|
                 @deliver_date            @pickup_date
                      |-----------------------|

Если это возвращает запись, у нас есть конфликт.

До сих пор очень неясно, как вы получаете доступ к входной информации, обращаетесь ли вы к элементам управления напрямую или используете привязку данных, и каковы имена элементов управления или свойств. Итак, давайте предположим, что вам удалось получить эту информацию в следующие переменные:

string vehicleId = ...;
DateTime deliveryDate = ...;
DateTime pickupDate = ...;

Затем

MySqlCommand cmd1 = new MySqlCommand("""
    SELECT id
    FROM db_reserve_vehicle
    WHERE
        vehicle_Id = @vehicle_Id AND
        pickup_date > @deliver_date AND
        deliver_date < @pickup_date
    """, DBConnection.con); //check query
cmd1.Parameters.AddWithValue("@vehicle_Id", vehicleId);
cmd1.Parameters.AddWithValue("@deliver_date", deliveryDate);
cmd1.Parameters.AddWithValue("@pickup_date", pickupDate);

MySqlDataReader reader = cmd1.ExecuteReader();
if (reader.Read())
{
    MessageBox.Show("vehicle still reserve.");
}
else
{
    MessageBox.Show("you can insert");
}

Еще один момент — схема базы данных. Данные, похоже, не нормализованы. То есть таблица резервирования вроде бы содержит всю информацию о транспортном средстве. Это означает, что вам придется вводить информацию об автомобиле несколько раз для каждого бронирования. Должна быть отдельная таблица транспортных средств, содержащая всю информацию о транспортном средстве (идентификатор, марка, тип, изображение и т. д.). В этом случае таблица резервирования должна ссылаться на транспортные средства только по идентификатору.

Большое спасибо сэру Оливье Жако-Декомбу за вашу помощь. Моя проблема уже решена. Большое спасибо, сэр Оливье Жако-Декомб.

user26743691 12.08.2024 16:01

Другие вопросы по теме