2012-03-01 11 views
5

Bir şirkette bir projede çalışıyorum. Bu sorguyu çözmeye çalışıyorum ama yapamadım. Bu benim timeSchedule tabloBugünkü randevularda doktorlara nasıl ulaşabilirim?

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 
  • geçerli::

    1. Appointments:

      Benim tablolardır

      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 
      

      Aslında daha değerler vardır ama bunlar yeterli olduğunu düşünüyorum problemi çöz.

    Bu timeSchedule tabloyla hasta randevuları kıyaslıyorum.

    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 
    

    nasıl yukarıdaki sonucu elde edebilirsiniz: Ben 56 ve olarak parametre doctorId geçmesi bugün sonra çıktı böyle olmalı 23 Mart olduğunu düşünecek olursak

    Şimdi varsayalım?

  • +0

    Neden id 1, 9:00 ile 8:00 için hiçbir hasta olduğunda? TimeSchedule girişi olmayan 10:00 ile 10:15 arasındaki bu gerginliğe ne dersiniz? –

    +0

    Bu kafa karıştırıcı. Sorgunuz tarafından neyin görüntüleneceğini belirleyen kurallar (veri örnekleri değil) nelerdir? –

    +0

    57 için son uygulamayla 1:15 ile 2:15 arasında mı demek istediniz? Bu diziyle eşleşecek gibi değiştim. Bu aynı zamanda aşağıda kullandığım veriler. – RThomas

    cevap

    4

    TimeSchedule.startTime ve timeSchedule.endTime öğelerinin her ikisi de Zaman veri türleri olduklarını varsayarsak, böyle bir şey olurdu: ... (değilse, bu şekilde yayınlayabilirsiniz). senin örnek veri ile bu döner

    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

    Sorguda, mevcut atamaların zaman çerçeveleri arasında başlamaması ya da bitmemesi ya da timeSchedule tarafından tanımlanan zaman dilimlerinin herhangi birinden sonra başlama ve sonlandırılma durumunda, bu doktor için herhangi bir randevu vermeniz gerektiği söyleniyor. tablo.

    da dönüş sürelerini biçimlendirilmesi bir simple matter. See the table in this link for all your options.

    +0

    Bir önceki uygulamanın daha önce başladığını ve belirli bir zaman diliminin ardından sona erdiğini bildiren üçüncü bir yan tümcesi ekledim. Bu, o slotu da kullanılamaz hale getirir. Yani, bu kodu kullanırsanız emin olun ve bu seçeneği göz önünde bulundurun. – RThomas

    +0

    Bu kod ayrıca, uygulamalarınızın bir günden diğerine geçmediğini varsayar (yani ertesi gün saat 11: 00'a kadar) – RThomas

    +0

    , karşılaştırma zamanının birinci ve ikinci koşulları arasında "VE" olmalıdır. – Mayur

    İlgili konular