gpt4 book ai didi

mysql - 选择特定时期内的所有可用项目

转载 作者:可可西里 更新时间:2023-11-01 07:06:52 24 4
gpt4 key购买 nike

所以我有 2 个表 caring 和 client,像这样

client {
id,
name
}

caring {
id,
startDate,
endDate,
clientId
}

我需要获取所有在两个提供的日期之间至少有一天可用的客户,您可以查看我的屏幕截图作为引用。

Screenshot

在截图中我有两个客户,我需要返回他们两个。如您所见,第一个客户在提供的时间段 (16.5.-29.5.) 之间有三天的空闲时间 (21.5.-23.5.),第二个客户没有任何护理时间。

到目前为止,我已经尝试过类似的方法

SELECT * FROM client cl
WHERE cl.id NOT IN (SELECT clientId FROM caring
WHERE endDate >= CURDATE() AND endDate <= DATE_ADD(CURDATE(), INTERVAL 14 DAY))

这个只返回根本不关心的客户。这部分是我需要的,因为此查询不涵盖我的屏幕截图中的第一个客户端。然后我尝试了下面的查询。

SELECT ca.startDate, ca.endDate, cl.firstName, cl.lastName
FROM caring ca
LEFT JOIN client cl on cl.id = ca.clientId
WHERE ca.startDate NOT IN (
SELECT endDate
FROM caring
) AND ca.startDate <= '2017-05-29' AND ca.endDate >= '2017-05-16'

但我没有得到想要的结果。

知道如何实现这一点,提前谢谢!

最佳答案

在感兴趣的时间段内选择关怀,并将开始/结束日期分别限制在该时间段内。此限制将允许更轻松地计算“已预订”,即以后的非空闲天数。

SELECT ca.id,
-- Limit start/end dates to period of interest, respectively
GREATEST (ca.startDate, '2017-05-16') AS `effectiveStartDate`,
LEAST (ca.endDate, '2017-05-29') AS `effectiveEndDate`,
ca.clientId
FROM carings ca
WHERE ca.startDate <= '2017-05-29' AND ca.endDate >= '2017-05-16';

接下来,计算预订天数:

DATEDIFF (DATE_ADD (LEAST (ca.endDate, '2017-05-29'), INTERVAL 1 DAY),
GREATEST (ca.startDate, '2017-05-16'))
AS `effectiveDays`

最后,筛选出在整个期间预订的客户。这是通过比较完成的

  • 每位客户的预订天数总和 ( GROUP BY )
  • 整个期间的天数 ( HAVING sumDays < DATEDIFF(...) )。

因为您还需要整个期间都没有预订的客户,我建议从 clients 开始表和“只是”LEFT JOIN (有效)carings :

  SELECT cl.id, cl.name, IFNULL (SUM (eca.effectiveDays), 0) AS `sumDays`
FROM clients cl
LEFT JOIN
(SELECT ca.id,
-- Limit start/end dates to period of interest, respectively
GREATEST (ca.startDate, '2017-05-16') AS `effectiveStartDate`,
LEAST (ca.endDate, '2017-05-29') AS `effectiveEndDate`,
DATEDIFF (
DATE_ADD (LEAST (ca.endDate, '2017-05-29'), INTERVAL 1 DAY),
GREATEST (ca.startDate, '2017-05-16'))
AS `effectiveDays`,
ca.clientId
FROM carings ca
WHERE ca.startDate <= '2017-05-29' AND ca.endDate >= '2017-05-16')
eca -- effectiveCarings
ON eca.clientId = cl.id
GROUP BY cl.id, cl.name
HAVING sumDays <
DATEDIFF (DATE_ADD ('2017-05-29', INTERVAL 1 DAY), '2017-05-16')
ORDER BY cl.id;

另见 http://sqlfiddle.com/#!9/1038b9/19

关于mysql - 选择特定时期内的所有可用项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43990552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com