作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
查询房间入住情况时,我得到了额外的天数。我认为这是因为即使在有两次预订的日子里,它仍然会执行 SUM(DATEDIFF(...) +1)
。例如,在 2 月份,它会返回房间的 31 天。
如何添加一天(除了有两次预订的日期之外),然后只需为两者之一添加 1 即可。
SELECT
room_id,
SUM(DATEDIFF(
LEAST(end_time, '2019-12-31 23:59:59'),
GREATEST(start_time, '2019-12-01 00:00:00')
) + 1) as days
FROM reservations
WHERE
(start_time >= '2019-12-01 00:00:00' AND start_time < '2020-01-01 00:00:00')
OR
(end_time >= '2019-12-01 00:00:00' AND end_time < '2020-01-01 00:00:00')
GROUP BY room_id
这是一个 fiddle ,代表不需要的额外一天, https://www.db-fiddle.com/f/ta53CprLisnRXh9A8wVwZv/1返回 7 天,但房间已保留 5 天
最佳答案
您可以使用 calendar table解决这个问题:
SELECT
room_id,
COUNT(DISTINCT date_value)
FROM test INNER JOIN (
SELECT ADDDATE('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) AS date_value
FROM
(SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
(SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
) calendar ON calendar.date_value BETWEEN CAST(start_time AS DATE) AND CAST(end_time AS DATE)
WHERE
(start_time >= '2019-02-01 00:00:00' AND start_time < '2019-03-01 00:00:00')
OR
(end_time >= '2019-02-01 00:00:00' AND end_time < '2019-03-01 00:00:00')
GROUP BY room_id;
日历表是一个生成表,以 1970-01-01 以来的所有日期作为日期值。您可以将表连接到日历表并计算与表匹配的所有不同日期。
关于mysql - 查询房间入住情况时获得额外天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60025306/
我正在尝试在两个日期之间预订所有房间。 我现在正在使用此查询,但遇到了问题。我尝试了很多东西,做了很多搜索,但几个小时后我决定尝试在这里寻求帮助。 SELECT 1 FROM reservations
我的数据库中有多个预订。每个预订属于不同的公寓。现在一些预订在同一日期被预订了两次,或者日期有点交叉,这意味着它被超额预订了我如何进行查询以过滤每个属性并找到超额预订并返回我他们的数量?我试过了: f
我正在集成我的应用程序,以便它可以编辑存储在 SharePoint 中的文件。我正在使用 Web 客户端服务 AKA WebDAV Redirector(webclnt.dll),它出色地完成了让正常
我是一名优秀的程序员,十分优秀!