SQL الذي يسرد X Records مع العدد الأسبوع وتاريخ الاثنين لكل أسبوع

StackOverflow https://stackoverflow.com/questions/20353802

  •  25-08-2022
  •  | 
  •  

سؤال

أبحث عن استعلام SQL من شأنه أن يوفر لي قائمة بالرقم الأسبوعي وتاريخ الاثنين لهذا الأسبوع بالذات.

فمثلا:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

العقب التالي ينتج أسبوعًا واحدًا

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
هل كانت مفيدة؟

المحلول

إذا لم يكن لديك جدول أرقام ، فيمكنك إنشاء قائمة بالأرقام المتسلسلة على الطيران باستخدام جداول النظام:

على سبيل المثال

SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM    sys.all_objects;

إذا كنت بحاجة إلى تمديد هذا للحصول على المزيد من الأرقام ، يمكنك عبور الجداول:

SELECT  Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

ثم تحتاج فقط إلى إضافة/طرح هذا العدد من الأسابيع من تاريخ البدء الخاص بك:

DECLARE @Monday DATE = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0);

WITH Numbers AS
(   SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
    FROM    sys.all_objects
)
SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, - n.Number, @Monday)
            FROM    Numbers n
        ) w;

هذه طريقة مطوّلة للقيام بذلك من أجل وضوح خطوة بخطوة ، يمكن تكثيفها إلى:

SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - ROW_NUMBER() OVER(ORDER BY object_id), 0)
            FROM    sys.all_objects
        ) w;

مثال على SQL Fiddle

هارون برتراند قام ببعض المقارنات المتعمقة طرق لتوليد قوائم متسلسلة من الأرقام:

بالطبع ستكون أسهل طريقة للقيام بذلك هي إنشاء ملف جدول التقويم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top