2012-03-01 42 views
5

我正在一家公司的項目中工作。我試圖解決這個查詢,但我不能。如何從今天的約會獲得醫生的空閒時間?

我的表是:

  1. Appointments

    doctorId patientId patientName fromDateTime   toDateTime 
    -------- --------- ----------- --------------------- --------------------- 
    56  1   fghfgh  3/23/2012 12:15:00 PM 3/23/2012 01:15:00 PM 
    56  2   asdadf  3/23/2012 01:15:00 PM 3/23/2012 02:15:00 PM 
    56  3   werwr  3/23/2012 09:15:00 AM 3/23/2012 10:15:00 AM 
    57  4   uiyui  3/23/2012 09:15:00 AM 3/23/2012 10:15:00 AM 
    57  5   asdad  3/23/2012 01:15:00 PM 3/23/2012 02:15:00 PM 
    
  2. 這是我timeSchedule表:

    id startTime  endTime 
    -- ------------ ------------ 
    1 08:00:00.000 09:00:00.000 
    2 09:00:00.000 10:00:00.000 
    3 11:00:00.000 12:00:00.000 
    4 12:00:00.000 13:00:00.000 
    5 13:00:00.000 14:00:00.000 
    6 14:00:00.000 15:00:00.000 
    7 15:00:00.000 16:00:00.000 
    

    其實有更多的價值,但我認爲這些都足以解決這個問題。

我在比較患者預約和timeSchedule表。

現在假設如果我通過參數doctorId爲56認爲今天是 3月23日,然後輸出應該是這樣的:

id startTime endTime 
-- --------- -------- 
1 08:00 AM 09:00 AM 
3 11:00 AM 12:00 PM 
6 02:00 PM 03:00 PM 
7 03:00 PM 04:00 PM 

我怎樣才能達到以上的結果?

+0

爲什麼ID 1,當沒有病人爲08:00至09:00?從10:00到10:15這段時間,沒有TimeSchedule條目呢? – 2012-03-01 19:22:30

+0

這是令人困惑的。什麼是規則(而不是數據樣本)確定查詢要顯示的內容? – 2012-03-01 19:23:10

+0

對於57的最後一個版本,你的意思是1:15到2:15嗎?我改變了看起來與該系列相匹配。這也是我在下面使用的數據。 – RThomas 2012-03-01 20:11:23

回答

4

假設timeSchedule.startTime和timeSchedule.endTime都是時間數據類型,那麼它會是這樣的......(如果沒有,你可以像這樣)。

DECLARE @pDoctorID Int = 56 
DECLARE @pDate Date = '3/23/2012' 

SELECT * FROM timeSchedule WHERE 
NOT Exists (
       SELECT doctorid FROM Appointments 
       WHERE doctorid = @pDoctorID AND 
       CAST(fromDatetime as Date) = @pDate AND 
       (
        (CAST(fromDatetime as Time) >= timeSchedule.startTime AND 
        CAST(fromDatetime as Time) <= timeSchedule.endTime) 
        OR 
        (CAST(toDatetime as Time) >= timeSchedule.startTime AND 
        CAST(toDatetime as Time) <= timeSchedule.endTime) 
        OR 
        (CAST(toDatetime as Time) <= timeSchedule.startTime AND 
        CAST(fromDatetime as Time) >= timeSchedule.endTime) 
       ) 
       ) 

與您的樣本數據返回此:

1 | 08:00:00.00 | 09:00:00.00

4 | 11:00:00.00 | 12:00:00.00

8 | 15:00:00.00 | 16:00:00.00

實質上,查詢是說給我這個醫生的任何約會,其中現有的任命不會在時間範圍之間開始或結束,或者在timeSchedule定義的任何時間段之後開始和結束之前開始和結束表。

格式化返回時間也是一個simple matter. See the table in this link for all your options.

+0

我剛剛添加了第三個條款來說明以前的應用程序何時開始並在給定時間段後結束。這將使該插槽不可用。因此,如果您使用此代碼,請確保並考慮該選項。 – RThomas 2012-03-01 21:36:42

+0

此代碼還假定您appts不從一開始就跨越到下一個...(即下午11點至凌晨1點,第二天) – RThomas 2012-03-01 21:41:25

+0

應該有「和」比較時間的第一和第二狀態之間。 – Mayur 2012-03-05 07:41:30

相關問題