Sql 计算预订系统中每个时段的预订数量

Sql 计算预订系统中每个时段的预订数量,sql,sql-server,Sql,Sql Server,我正在尝试创建一个预订系统,允许客户从可用插槽列表中选择一个。时间间隔为09:00-17:00,每15分钟一次 预订的时间长短取决于其他地方计算的要收集的物品数量,并且总是四舍五入到最近的15分钟时段 我试图做的是查询现有的预订,并返回插槽列表和每个插槽中的预订数量。如果预订在某个时间段内,例如09:00-10:00的预订将在09:00、09:15、09:30m和09:45,我只想在每个时段的计数上加1 然后,我将把这个结果和一个员工列表结合起来,以显示有多少员工可用,从而显示插槽是否空闲,但这

我正在尝试创建一个预订系统,允许客户从可用插槽列表中选择一个。时间间隔为09:00-17:00,每15分钟一次

预订的时间长短取决于其他地方计算的要收集的物品数量,并且总是四舍五入到最近的15分钟时段

我试图做的是查询现有的预订,并返回插槽列表和每个插槽中的预订数量。如果预订在某个时间段内,例如09:00-10:00的预订将在09:00、09:15、09:30m和09:45,我只想在每个时段的计数上加1

然后,我将把这个结果和一个员工列表结合起来,以显示有多少员工可用,从而显示插槽是否空闲,但这不是这个问题的一部分

返回数据示例:

TimeSlot | BookingsCount
------------------------
09:00    | 2
09:15    | 2
09:30    | 1
09:45    | 1
10:00    | 0
创建表schedulet time; 插入ScheduleTimes值'09:00'; 插入ScheduleTimes值'09:15'; 插入ScheduleTimes值'09:30'; 插入ScheduleTimes值'09:45'; 插入ScheduleTimes值“10:00”; 插入ScheduleTimes值“10:15”; 在ScheduleTimes值“10:30”中插入; 插入ScheduleTimes值“10:45”; 在ScheduleTimes值“11:00”中插入; 插入ScheduleTimes值'11:15'; 在ScheduleTimes值“11:30”中插入; 插入ScheduleTimes值“11:45”; 在ScheduleTimes值“12:00”中插入; 插入ScheduleTimes值'12:15'; 插入ScheduleTimes值“12:30”; 创建表CollectionSchedule ScheduleID int、CustomerID int、CollectionStart time、CollectionEnd time; 插入到CollectionSchedule值1111,'09:00','10:00'; 插入到CollectionSchedule值2222,'09:00','09:30'; 在CollectionSchedule值中插入333,'09:30','10:00'; 将值4444,'10:00','10:15'插入CollectionSchedule; 在CollectionSchedule中插入值5555、'10:00'、'11:00'; 在CollectionSchedule中插入值6666,'10:15','10:45'; 在CollectionSchedule中插入值777,'10:45','11:00'; 这个模式不是一成不变的,如果有必要可以更改,这正是我到目前为止提出的

以下是演示模式:

已预约的收款时间表列表:

create table CollectionSchedule (ScheduleID int, CustomerID int, CollectionStart time, CollectionEnd time);
ScheduleTimes可用时隙的列表

create table ScheduleTimes (t time);
以下是我最新的查询尝试:

select 
    st.t,
    SUM(sq1.intimeframe) as BookingsCount
from
    ScheduleTimes st
    left join (
        select 
            st.t as Slot,
            case when (st.t <= cs.CollectionStart and st.t < cs.CollectionEnd) then 1 else 0 end as intimeframe 
        from CollectionSchedule cs, @ScheduleTimes st
    ) sq1 on st.t = sq1.Slot
group by st.t

但这会返回每个插槽中的预订数量的错误值,因为它会多次计算条目,而且我显然走错了路,有点迷路了。任何帮助都将不胜感激。

像这样的操作是否会返回适当的值

SELECT Agg.T, COUNT(*) 
FROM(SELECT s.T FROM CollectionSchedule as c
INNER JOIN ScheduleTimes as s 
ON s.T >= c.CollectionStart AND s.T < c.CollectionEnd) as Agg
GROUP BY Agg.T;

只是区间交叉口的一个左连接

select 
    st.t,
    count(cs.ScheduleID) n
from
    ScheduleTimes st
    left join CollectionSchedule cs on cs.CollectionStart < dateadd(minute, 15, st.t) and  st.t < cs.CollectionEnd
group by st.t

我的朋友,你做到了。谢谢你能破译一个盘带式的问题,也谢谢你教我新东西。是时候开始学习交叉连接了。再次感谢。这不是严格意义上的交叉连接。将其更改为内部,并使WHERE子句成为ON子句。@gvee有意义。我将编辑答案,以防将来有人有相同类型的问题