Пожалуйста, взгляните на изображение ниже.
и это мой образец БД.
Я хочу использовать запрос для проверки двух диапазонов дат (перекрывающихся), но не знаю, как это сделать. Моя идея состоит в том, чтобы выполнить этот код внутри или после того, как я нажму кнопку «Зарезервировать».
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");
}
Не предоставляйте дополнительную информацию, редактируя ответы других. Вместо этого отредактируйте свой вопрос.
Оливье Жако-Декомб, Извините, сэр.
Чтобы убедиться, что между двумя датами нет совпадения (потому что я предполагаю, что вы этого хотите), вы можете проверить
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");
}
Еще один момент — схема базы данных. Данные, похоже, не нормализованы. То есть таблица резервирования вроде бы содержит всю информацию о транспортном средстве. Это означает, что вам придется вводить информацию об автомобиле несколько раз для каждого бронирования. Должна быть отдельная таблица транспортных средств, содержащая всю информацию о транспортном средстве (идентификатор, марка, тип, изображение и т. д.). В этом случае таблица резервирования должна ссылаться на транспортные средства только по идентификатору.
Большое спасибо сэру Оливье Жако-Декомбу за вашу помощь. Моя проблема уже решена. Большое спасибо, сэр Оливье Жако-Декомб.
«Я хочу использовать запрос для проверки двух диапазонов дат (перекрывающихся)» — см.: stackoverflow.com/questions/13513932/….