mysql– 选择特定时间段内的所有可用项目

mysql– 选择特定时间段内的所有可用项目,第1张

概述所以我有2张桌子照顾和客户,就像这样client { id, name } caring { id, startDate, endDate, clientId } 我需要让所有在两个提供的日期之间至少有一天可用的客户,您可以看到我的屏幕截图作为参考.截图我有两个客户端,我需要返回它们.如您所见,第一个客户在提供期间(16.5.-29

所以我有2张桌子照顾和客户,就像这样

clIEnt {  ID,name}caring {  ID,startDate,endDate,clIEntID}

我需要让所有在两个提供的日期之间至少有一天可用的客户,您可以看到我的屏幕截图作为参考.

截图我有两个客户端,我需要返回它们.如您所见,第一个客户在提供期间(16.5.-29.5.)之间有三个免费日(21.5.-23.5.),而第二个客户没有任何关怀期.

到目前为止,我尝试过这样的事情

SELECT * FROM clIEnt clWHERE 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.lastnameFROM caring caleft JOIN clIEnt cl on cl.ID = ca.clIEntIDWHERE ca.startDate NOT IN (    SELECT endDate    FROM caring ) AND ca.startDate <= '2017-05-29' AND ca.endDate >= '2017-05-16'

但我没有得到理想的结果.

任何想法我怎么能实现这一点,提前thx!

最佳答案选择感兴趣的期间的关怀并分别限制此期间的开始/结束日期.这种限制将允许更容易计算“已预订”,即以后不是免费的日子.

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)的预订天数总和
>整个期间的天数(具有sumDays< DATEDIFF(...)).
你也想要整个期间都没有预订的客户,我建议从客户表开始,“只是”left JOIN(有效)关注:

  SELECT cl.ID,cl.name,IFNulL (SUM (eca.effectiveDays),0) AS `sumDays`    FROM clIEnts cl         left JOIN         (SELECT ca.ID,respectively                 GREATEST (ca.startDate,DATEDIFF (                    DATE_ADD (LEAST (ca.endDate,'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.IDGROUP BY cl.ID,cl.name  HAVING sumDays <            DATEDIFF (DATE_ADD ('2017-05-29','2017-05-16')ORDER BY cl.ID;

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

以上是内存溢出为你收集整理的mysql – 选择特定时间段内的所有可用项目全部内容,希望文章能够帮你解决mysql – 选择特定时间段内的所有可用项目所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1168699.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存