2017-05-09 6 views
4

私は、以下の既知のパラメータに基づいて発生するイベントの合計数を計算しようとしているの日付範囲と設定日数に基づいて発生数を取得週

  1. 開始日
  2. 終了日
  3. 週の
  4. 次の例に基づいて、数週間(毎週、2週間毎、等)。例えば

  • 周波数、データ:

    1. 2017年5月1日
    2. 2017年5月31日
    3. 1,4(日曜日、水曜日)
    4. ごとに2週間

    私はそれを計算しなければなりませんこのイベントは4回実行されます(5/7、5/10、5/21、5/24)

    以下は私が設定したスケルトンです。私は完全に週の数に基づいてループの現在の日を増やす方法に困っています。

    <cfset local.totalRuns = 0 /> 
    
    <cfset local.startDate = '2017-05-01' /> 
    <cfset local.endDate = '2017-05-31' /> 
    <cfset local.totalDays = DateDiff("d", local.startDate, local.endDate) /> 
    
    <cfset local.daysPerWeek = '1,4' /> 
    <cfset local.recurrence = 2 /> 
    
    <cfset local.currentLoop = 0 /> 
    <cfset local.weeksToCount = local.recurrence * 2 /> 
    
    <!--- Loop a day at a time ---> 
    <cfloop from="#local.startDate#" to="#local.endDate#" index="local.thisDay" step="#createTimespan(1, 0, 0, 0)#"> 
    
        <cfset local.currentDate = local.thisDay /> 
    
        <!--- Loop over each allowed day of the current week and determine actual date ---> 
        <cfloop list="#local.daysPerWeek#" index="local.currentDay"> 
    
    
         <!--- if current date does not exceed the end date add increment (this current is incorrect) ---> 
         <cfif DateDiff("d", local.currentDate, local.endDate) LTE 0> 
          <cfset local.totalRuns++ /> 
         </cfif> 
        </cfloop> 
    
        <cfset local.currentLoop++ /> 
    </cfloop> 
    
  • +0

    local.totalRunsとlocal.currentLoopの最後にどのような値がありますか? – tech2017

    +1

    私は日付範囲のチェックのために日付ディメンションテーブルを使用することの巨大なファンです。私はまた、イベントが実際に発生したときに修正することが、ここのトリックだと思っています。私が何かを誤解していない限り、2週間ごとに日曜日に実行さえすれば、startDateを5/1と5/8に設定すると、このコードは異なる結果を返すと思います。 – Shawn

    +0

    ショーン - あなたは2週間は少し不明であることは間違いありません。今週は1週間が始まり、2週間はFOLLOWINGの週が始まり、その後は2週間が始まります。これはちょっとしたものです。 –

    答えて

    1

    これは書式設定されたコメントです。それは私が取るアプローチを示しています。

    set the recurrence count to 0 
    
    start looping through the list of valid days of the week (1,4) in this case 
    
    set the control date to the start date. 
    
    do something to set the control date to the earliest 
    date that matches the day of the week in this loop. 
    
    if the control date is greater than the end date, break out of the loop. 
    otherwise 
    
    add 1 to the recurrence count 
    
    set up a while loop that adds the specified number of weeks 
    to the control date, and repeats the check I just described 
    
    end looping through the list of valid days of the week (1,4) in this case 
    
    関連する問題