繁体   English   中英

如何检查数据库中的元素是否可用?

[英]How to check if an element is available in a database?

我已经启动了一个 C# 控制台(.net 框架),我想在数据库中插入一个新的预订,但首先我必须检查我要租的汽车是否存在并且可用(它不在出租)。 可用是指我想租车的时间间隔应该是免费的。 这是我的问题。 如何通过开始时间和结束时间来检查它? 对此有特殊查询吗?

例如,如果我想在 2020 年 5 月 12 日至 13 日之间租车,查询将类似于?

Select StartDate, EndDate
from Reservations 
where (StartDate < 'startDate = 12/05/2020' and EndDate > 'startDate = 12/05/2020') or (StartDate < 'endDate = 13/05/2020' and EndDate > 'endDate = 13/05/2020')

这是我对汽车存在的尝试:

public bool validateCartRentData(CartRent rent)
        {
            bool validation = true;

            using (databaseConnection = new SqlConnection())
            {
                try
                {
                    setDatabaseConection();
                    databaseConnection.Open();

                    string query = "SELECT COUNT(*) FROM [Cars] WHERE ([Plate] = @Plate)";
                    SqlCommand checkCarModel = new SqlCommand(query, databaseConnection);

                    checkCarModel.Parameters.AddWithValue("@Plate", rent.car.plate);
                    int carExists = (int)checkCarModel.ExecuteScalar();

                    Console.WriteLine(carExists);

                    if (carExists < 0)
                    {
                        return validation;
                    }

                }
                catch (SqlException e)
                {
                    Console.WriteLine(e);
                }

                return false;
            }
        }

这是我的数据库 model:

数据库 model

我是第一次使用数据库,所以请不要对我太苛刻! 谢谢!

 Select StartDate, EndDate from Reservations where (StartDate < 'startDate = 12/05/2020' and EndDate > 'startDate = 12/05/2020') or (StartDate < 'endDate = 13/05/2020' and EndDate > 'endDate = 13/05/2020')

首先,如果开始和结束日期是我们的输入,我们会想要 output 别的东西,可能像carID

查看日期时,我们需要在新预订开始之前结束预订,或者在旧预订结束后开始新预订。 这里有一个假设,即预订在开始之前永远不会结束,我希望这是安全的。 ;)

NewStartNewEnd是我们要检查的新预订日期。

SELECT carID
FROM Reservations
WHERE (StartDate > NewEnd) OR (EndDate < NewStart)

这将为我们提供所有与我们的新租赁不重叠的租赁汽车的列表。 然而,这可能包括一辆有另一辆出租汽车的汽车。 如果我们否定WHERE语句,我们可以得到一个carID的列表,该列表具有无效的保留。 然后我们只需要一个不在列表中的carID列表:

SELECT DISTINCT carID /*Available Cars*/
FROM Reservations /*Could also take this from a cars table*/
WHERE carID NOT IN 
(SELECT carID /*Unavailable Cars*/
FROM Reservations
WHERE NOT((StartDate > '2020-05-16') OR (EndDate < '2020-05-14')))

概括:

有效预订在我们的新预订之后或之前结束。 获取所有预订无效的汽车的列表。 获取不在上一个列表中的所有汽车的列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM