使用24小时时间减去彼此重叠的约会时间

时间:2014-01-02 17:12:56

标签: sql sql-server-2008 schedule

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

Figuring out the difference in hours between two 24-hour times in SQL

我需要弄清楚临床医生在下周可用的时间。系统设置的方式是他们将时间块指定为“可用”,然后人们可以在可用时间的顶部填写约会。可用时间和每个约会将作为自己的行输入数据库,“可用时间”或“约会”将被指定为时间块的“类型”。

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

这是数据的样子和我当前的查询的例子:

http://sqlfiddle.com/#!3/a110e/1/0

我在Microsoft SQL Server 2008中工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个:

http://sqlfiddle.com/#!3/a110e/8

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