2012-03-01 25 views
5

Tôi đang làm việc trên một dự án trong một công ty. Tôi đang cố gắng giải quyết truy vấn này nhưng tôi không thể.Làm thế nào để có được thời gian có sẵn cho bác sĩ từ các cuộc hẹn ngày hôm nay?

bảng của tôi là:

  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. Đây là timeSchedule bàn của tôi:

    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 
    

    Trên thực tế có rất nhiều giá trị nhưng tôi nghĩ rằng đây là những đủ để giải quyết vấn đề.

Tôi so sánh các cuộc hẹn bệnh nhân với bảng timeSchedule này.

Bây giờ giả sử nếu tôi vượt qua tham số doctorId như 56xem xét hôm nay là ngày 23 tháng 3 sau đó đầu ra nên như thế này:

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 

Làm thế nào tôi có thể đạt được kết quả trên?

+0

Tại sao id 1, khi không có bệnh nhân từ 8:00 đến 9:00? Điều gì về khoảng thời gian đó từ 10:00 đến 10:15, mà không có mục nhập TimeSchedule? –

+0

Điều này thật khó hiểu. Các quy tắc (không phải mẫu dữ liệu) xác định những gì được hiển thị bởi truy vấn của bạn? –

+0

Ý của bạn là 1:15 đến 2:15 trong lần xuất hiện cuối cùng cho 57? Tôi thay đổi như vậy dường như để phù hợp với bộ truyện. Đó cũng là dữ liệu tôi đã sử dụng bên dưới. – RThomas

Trả lời

4

Giả sử rằng thời gianSchedule.startTime và timeSchedule.endTime là cả hai kiểu dữ liệu Thời gian thì nó sẽ là một cái gì đó như thế này ...: (nếu không, bạn có thể truyền như vậy).

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) 
       ) 
       ) 

nào với dữ liệu mẫu của bạn trả về này:

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

Về bản chất truy vấn đang cho tôi bất kỳ cuộc hẹn nào cho bác sĩ này khi các cử hiện tại không bắt đầu hoặc kết thúc giữa các khung thời gian hoặc bắt đầu trước và kết thúc sau bất kỳ thời điểm nào được xác định bởi timeSchedule bàn.

Định dạng thời gian trả lại cũng là simple matter. See the table in this link for all your options.

+0

Tôi vừa thêm mệnh đề thứ ba vào tài khoản khi một appt trước đó bắt đầu trước và kết thúc sau một khoảng thời gian nhất định. Điều đó sẽ làm cho vị trí đó không khả dụng. Vì vậy, nếu bạn sử dụng mã này hãy chắc chắn và xem xét tùy chọn đó. – RThomas

+0

Mã này cũng giả định rằng các ứng dụng của bạn không chuyển từ ngày này sang ngày khác ... (tức là từ 11 giờ đến 1 giờ sáng ngày hôm sau) – RThomas

+0

phải có "VÀ" ở giữa điều kiện thứ nhất và thứ hai so sánh thời gian. – Mayur

Các vấn đề liên quan