SQL-查找日期范围内的可用插槽

时间:2018-08-20 13:33:12

标签: mysql sql

我有以下数据库架构:

CREATE TABLE `property` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL
);
CREATE TABLE `venue` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `property_id` INT(11) NOT NULL,
    `name` VARCHAR(100) NOT NULL
);
CREATE TABLE `venue_available` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `venue_id` INT(100) NOT NULL,
    `day` VARCHAR(10) NOT NULL,
    `from_time` TIME NOT NULL,
    `to_time` TIME NOT NULL,
    `lead_time_in_minutes` INT(11)
);
CREATE TABLE `venue_unavailable` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `venue_id` INT(100) NOT NULL,
    `from_datetime` DATETIME NOT NULL,
    `to_datetime` DATETIME NOT NULL
);
CREATE TABLE `venue_reservation` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `venue_id` INT(100) NOT NULL,
    `start_datetime` DATETIME NOT NULL,
    `end_datetime` DATETIME NOT NULL
);

我想找到在8月25日(星期六)至8月27日(星期一)的上午10点至下午3点开放活动的物业

这是我尝试过的SQL查询

SELECT
    p.id,
    p.name AS property_name,
    v.name AS venue_name
FROM
    venue v
LEFT JOIN
    property p ON v.property_id = p.id
-- venue_available
LEFT JOIN
    venue_available va_0 ON va_0.venue_id = v.id
LEFT JOIN
    venue_available va_1 ON va_1.venue_id = v.id
WHERE 1 = 1
-- venue_available
    AND (
        (va_0.day = 'sat' AND va_0.from_time <= '2018-08-25 10:00:00' AND va_0.to_time >= '2018-08-25 15:00:00') AND
        (va_1.day = 'sun' AND va_1.from_time <= '2018-08-26 10:00:00' AND va_1.to_time >= '2018-08-26 15:00:00')
    )
-- venue_unavailable
    AND NOT EXISTS (SELECT * FROM venue_unavailable vu WHERE '2018-08-25 10:00:00' <= vu.to_datetime AND '2018-08-26 15:00:00' >= vu.from_datetime)
GROUP BY
    p.id;

当前查询的问题是,SQL查询中venue_available的条件似乎可以正常工作,但是当我添加venue_unavailable的条件时,它将返回空结果,但是基于我期望有1个结果的数据。

如果您想使用模式和固定装置,这里是SQL小提琴的链接

http://sqlfiddle.com/#!9/33d60f/10

这就是我想要做的
1.获取所有属性(而非场所)的列表 2.使用

检查后,仅在一个或多个场所可用时列出财产
  • venue_available
  • venue_unavailable
  • venue_reservation

您能帮我解决这个问题吗?x

谢谢。

UPDATE1

我关注了以下博文,以确定会场Select rows that are not between dates (reservation)不可用的重叠日期

1 个答案:

答案 0 :(得分:1)

好的,所以我解决它的方法是使用现在正在工作的子查询。

我现在将WHERE子句与类似的东西一起使用

    // GET: api/Review
    public IQueryable<Review> Get_Review()
    {
        return db.Review;
    }

    // GET: api
    public IEnumerable<Review> Get_store(string aa)
    {
        //This does not work
        return db.Review.Any(s => s.site == aa);
    }

    // GET: api/Review/5
    [ResponseType(typeof(Review))]
    public IHttpActionResult Get_Review(int id)
    {
        Review review = db.Review.Find(id);
        if (Review == null)
        {
            return NotFound();
        }

        return Ok(Review);
    }

这似乎已经做好了。