SQL Datediff على التواريخ غير المتجاورة
سؤال
لدي طاولة تبدو هكذا:
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