سؤال

لدي طاولة تبدو هكذا:

Code    Mark Date   Notional
Beta    5/1/2008    $1,102,451.00
Beta    5/2/2008    $1,102,451.00
Beta    5/5/2008    $1,102,451.00
Beta    5/6/2008    $1,102,451.00

أحتاج إلى إنشاء جدول يحتوي على جميع تواريخ العلامة في عمود واحد والفرق بين كل تاريخ علامة مجاورة عند فرزه في عمود آخر. هذا هو SQL الذي كتبته:

SELECT 
    Current.[Mark Date],
    Prev.[Mark Date],
    (DATEDIFF("d", Prev.[Mark Date], Current.[Mark Date])/365)

FROM Notional as Prev, Notional as Current
WHERE (Prev.[Mark Date] = (Current.[Mark Date]-1));

ومع ذلك ، لن ينضم هذا SQL خلال عطلة نهاية الأسبوع في 5/5/2008 -> 5/2/2008 على سبيل المثال أو في عطلات نهاية الأسبوع الطويلة. كيف يمكنني الحصول على الجدول للانضمام إلى التواريخ غير المتجاورة؟ شكرا لجميع التعليمات!

هل كانت مفيدة؟

المحلول

الطريقة الوحيدة للقيام بذلك هي استخدام row_number (و row_number+1) في تحديد مطلوب حسب التاريخ للحصول على SQL يدعم أرقام الصفوف أو لإنشاء جدول مؤقت مع مفتاح زيادة تلقائي تملأه في ترتيب التاريخ.

لا توجد طريقة أخرى دون اللجوء إلى حل غير متصل (وهي حلقة.)

نصائح أخرى

يمكنك محاولة استخدام ROW_Number عند الاختيار والانضمام إلى هذا الطلب حسب التاريخ.

تعديل. تم مع انضمامات.

ما يمكنك فعله هو الانضمام إلى الجدول لنفسه ، في تواريخ أكبر من هذا الصف ، ثم تجميع MIN وتحديدها.

شيء من هذا القبيل

DECLARE @Table TABLE(
        DateVal DATETIME
)

INSERT INTO @Table SELECT '01 May 2009'
INSERT INTO @Table SELECT '02 May 2009'
INSERT INTO @Table SELECT '05 May 2009'
INSERT INTO @Table SELECT '06 May 2009'

SELECT  t.DateVal,
        MIN(tNext.DateVal) NextDate
FROM    @Table t LEFT JOIN
        @Table tNext ON t.DateVal < tNext.DateVal
GROUP BY t.DateVal

أعلم أن هذا هو رمز خادم SQL ، ولكن يمكن تغييره بسهولة إلى MS Access.

هذا يجب أن يعيد العازل:

StartDate                  EndDate
2009-05-01 00:00:00.000 2009-05-02 00:00:00.000
2009-05-02 00:00:00.000 2009-05-05 00:00:00.000
2009-05-05 00:00:00.000 2009-05-06 00:00:00.000
2009-05-06 00:00:00.000 NULL
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top