2012-03-01 6 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テーブルと患者の予定を比較しています。今私は 56とし、パラメータdoctorIdを渡すと、今日考慮するとし

は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 9:00 8:00には、患者はありませんとき? 10:00から10:15までのストレッチはどうですか?そのため、タイムスケジュールのエントリはありません。 –

+0

これは混乱しています。クエリによって表示される内容を決定するルール(データサンプルではない)は何ですか? –

+0

57の最後のapptで1:15から2:15を意味しましたか?私はそれがシリーズに一致するように見えるように変更されました。それは私が以下に使用したデータでもあります。 – RThomas

答えて

4

timeSchedule.startTimeとtimeSchedule.endTimeが両方ともTimeデータ型であるとすると、this ... :(そうでない場合は、そのままキャストできます)。あなたのサンプル・データと、この返し

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

私はちょうど前のapptが前に始まって、与えられたタイムスロットの後に終了するときに考慮する第3節を追加しました。そうすれば、そのスロットも利用できなくなります。したがって、このコードを使用している場合は、そのオプションを確認してください。 – RThomas

+0

このコードでは、あなたのアプレットがある日から次の日に交差しないと仮定しています...(つまり、午後11時〜午後1時) – RThomas

+0

比較時間の第1条件と第2条件の間に「AND」が必要です。 – Mayur

関連する問題