0

私はこの問題を抱えています:次の予定された、定期的な予定を持つ顧客のリスト。これは、年次、月次、または四半期のいずれかです。

私が持っているテーブル\列は次のとおりです。

customer
   customer_ID
service
   customer_ID
   service_RecID
Resource
   service_RecID
   Recurrence_RecID
   Date_Time_Start
Recurrence
   Recurrence_RecID
   RecurType
   RecurInterval
   DaysOfWeek
   AbsDayNbr
   SelectInterval

スケジュールが設定されたときに、date_start_timeが最初の繰り返しの予定が行われた日付になるようにモデル化されています。元。

Recurrence_RecID = 10
RecurType = m (could be y, or d as well for yearly or daily)
RecurInterval = 6 (if recurType = y, this would mean every 6 years)

システムがこれらを毎晩生成する場合、顧客ごとに次に予定されている予定を計算するためのクエリをどのように記述しますか?私は当初、Resource.Date_Time_Startを使用して、変数nextAppointment> = today()まで循環することを考えていましたが、SQLでループを実行することをお勧めしますか?

これ以上の情報が必要な場合は、私に知らせてください。どうもありがとうございました!

編集:sqlfiddleを作成します。

4

1 に答える 1

1

ループではなく、サブクエリを使用することをお勧めします。そうすればより効率的です。これは正確ではないかもしれませんが、次のようなものです...

SELECT 
    *
FROM
(      
SELECT
    customer.customer_id,
    service.service_RecID,
    Resource.Date_Time_Start,
    Recurrence.Recurrence_RecID,
    RecurType,
    RecurInterval,
    DaysOfWeek,
    AbsDayNbr,
    SelectInterval,
    NextAppointmentDate=
    CASE 
        WHEN RecurType='m' THEN DATEADD(MONTH,RecurInterval,Resource.Date_Time_Start)
        WHEN RecurType='y' THEN DATEADD(YEAR,RecurInterval,Resource.Date_Time_Start)
    ELSE 
        NULL
    END        
FROM
    Recurrence
    INNER JOIN Resource ON Resource.Recurrence_RecID=Recurrence.Recurrence_RecID
    INNER JOIN service ON service.service_RecID=Resource.service_RecID
    INNER JOIN customer ON customer.customer_ID=service.customerID
)AS X
WHERE
    NextAppointmentDate>=GETDATE()
ORDER BY Fields...
于 2013-02-08T02:39:07.467 に答える