سؤال

أنا أعمل على طلب تكرار للأحداث. لدي نطاق تاريخ من القول ، من 1 يناير 2010 إلى 31 ديسمبر 2011. أريد أن أعيد جميع أيام الخميس الثالثة (التعسفية) من كل شهر ، بكفاءة. يمكنني أن أفعل ذلك بشكل تافهة في الكود ، التحذير هو أنه يجب يتم في إجراء مخزن. في النهاية أريد شيئًا مثل:

CALL return_dates(event_id);

يحتوي هذا Event_id على start_date من 1/1/2010 و end_date 12/31/2011. مجموعة النتائج ستكون مثل:

1/20/2010
2/14/2010
3/17/2010
4/16/2010
5/18/2010
etc. 

أنا فقط أشعر بالفضول حول الطريقة الأكثر فعالية للقيام بذلك ، بالنظر إلى أنني قد ينتهي بي الأمر بنتيجة كبيرة جدًا في استخدامي الفعلي.

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

المحلول

إحدى الأفكار التي تتبادر إلى الذهن - يمكنك إنشاء جدول وتخزين التواريخ التي تهتم بها هناك.

نصائح أخرى

حسنًا ، لم أختبرها ، لكنني أعتقد أن الطريقة الأكثر فاعلية للقيام بذلك هي عبر جدول العدد الذي يعد أمرًا مفيدًا في DB على أي حال:

IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[num_seq]') AND type in (N'U'))
DROP TABLE [dbo].[num_seq];

SELECT TOP 100000 IDENTITY(int,1,1) AS n
INTO num_seq
FROM MASTER..spt_values a, MASTER..spt_values b;

CREATE UNIQUE CLUSTERED INDEX idx_1 ON num_seq(n);

يمكنك بعد ذلك استخدام هذا لإنشاء نطاق التاريخ بين التاريخين. إنه سريع لأنه يستخدم الفهرس فقط (في الواقع في كثير من الأحيان أسرع من حلقة ، لذلك أدت إلى تصديق)

create procedure getDates
    @eventId int
AS
begin

declare @startdate datetime
declare @enddate datetime

--- get the start and end date, plus the start of the month with the start date in
select @startdate=startdate, 
       @enddate=enddate
       from events where eventId=@eventId

  select
         @startdate+n AS date,
       from
         dbo.num_seq tally
       where
        tally.n<datediff(@monthstart, @enddate) and
        Datepart(dd,@startdate+n) between 15 and 21 and
        Datepart(dw, @startdate+n) = '<day>'

بصرف النظر عن تواريخ البدء والنهاية ، يجب أن يكون معرف X الثالث كل شهر بين 15 و 21 شاملًا. يجب أن تكون أسماء اليوم في هذا النطاق فريدة من نوعها ، حتى نتمكن من تحديد موقعه على الفور.

إذا كنت تريد اسم DayName الثاني ، فما عليك سوى تعديل النطاق بشكل مناسب أو استخدم معلمة لحسابها.

إنه يشكل جدولًا تاريخًا باستخدام StartDate ، ثم إضافة أيام (عبر قائمة الأرقام في جدول TALLY) حتى يصل إلى تاريخ الانتهاء.

أتمنى أن يساعد!

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