Sql 使用24小时时间相互减去重叠的约会时间

Sql 使用24小时时间相互减去重叠的约会时间,sql,sql-server-2008,schedule,Sql,Sql Server 2008,Schedule,我正在对一个表运行一个查询,该表包含不同临床医生的预约信息。每行都是不同的时间段,可以指定不同的名称,如约会、可用、,不可用它包括一个日期字段和两个开始时间和结束时间字段,它们都存储为整数并在24小时内格式化。我对数据库没有任何控制权,因此我无法将其更改为常规日期时间格式。从我的上一个问题开始,我已经知道如何将它们转换为标准时间并计算时间的持续时间从那里开始的约会 我需要能够计算出临床医生在接下来的一周有多少可用时间。系统的设置方式是,他们指定可用的时间段,然后人们可以在可用时间之外填写预约。可

我正在对一个表运行一个查询,该表包含不同临床医生的预约信息。每行都是不同的时间段,可以指定不同的名称,如约会、可用、,不可用它包括一个日期字段和两个开始时间和结束时间字段,它们都存储为整数并在24小时内格式化。我对数据库没有任何控制权,因此我无法将其更改为常规日期时间格式。从我的上一个问题开始,我已经知道如何将它们转换为标准时间并计算时间的持续时间从那里开始的约会

我需要能够计算出临床医生在接下来的一周有多少可用时间。系统的设置方式是,他们指定可用的时间段,然后人们可以在可用时间之外填写预约。可用时间和每个约会将作为其自己的行输入数据库,可用时间或约会将指定为时间块的类型

我在计算可用时间时遇到的问题是,虽然约会安排在可用时间内,但数据库中该可用时间的行保持不变。因此,如果有一排可用时间从800到1430,并且同一位临床医生在同一天的预约时间从800到1000,那么可用时间的排仍然是800到1430。我需要一种方法,当约会重叠时,从可用时间块中减去约会。所以在前面的例子中,它会说临床医生仍然有4.5小时的可用时间,而不是说有8.5小时的可用时间。但是,在某些情况下,一天的预约时间可能与临床医生的可用时间不重叠,因此仅减去两者并不总是有效的

这是一个示例,说明了数据的外观以及我对它的当前查询:

我在MicrosoftSQLServer2008工作

谢谢

试试这个:


这不是计算可用小时数和使用小时数,而是知道何时从可用小时数中减去使用小时数。因此,对于本例中的John,您可以从可用值中减去used,因为它们在时间上完全重叠。但对肯来说,你不能这样做,因为他的一次约会不会与他的可用时间重叠,所以不会减少他的可用时间。我主要需要的是一种方式来表明约会的时间或部分时间以及与可用时间重叠的程度。
SELECT
ap.Staff,
ap.Date,
SUM(CAST((((EndTime % 100 + (EndTime / 100) * 60) - (BeginTime % 100 + (BeginTime / 100) * 60)) / 60.0) as DECIMAL(5,2))) as AvailableTime,
ud.Usedtime
FROM Appointments ap
JOIN 
(
  SELECT
  Staff,
  Date,
  SUM(CAST((((EndTime % 100 + (EndTime / 100) * 60) - (BeginTime % 100 + (BeginTime / 100) * 60)) / 60.0) as DECIMAL(5,2))) as UsedTime
  FROM Appointments ap
  WHERE Type <> 'Available'
  GROUP BY Staff, Date
  )  ud on ap.staff=ud.staff and ap.date=ud.date

WHERE Type = 'Available'

GROUP BY ap.Staff, ap.Date,ud.UsedTime