2

私のクライアントは、多くの場合、何ヶ月も前に顧客の予約をスケジュールします。予約が米国の休日の日/週の間に発生した場合、私のクライアントは、スケジュールの日付が米国の休日の間にあることを通知したいと思います(彼女は休日のサービスに対してより多くの料金を請求します)。

私のクライアントは、次の日付のみに関心があります。

  • 正月12月30日〜1月2日
  • 3月の春休み週間(3月の第3週)
  • イースターウィークエンド(この日付は毎年異なります)
  • 5月のメモリアルデーウィークエンド
  • 7月の独立記念日の週末
  • 9月のレイバーデーウィークエンド
  • 11月の月曜日から日曜日の感謝祭の週
  • クリスマスウィーク12月22〜28日

彼女が毎年データベースを更新する必要がないように、これを可能な限り自動化したいと思いますが、それは彼女の要件ではなく、私の要件です。:D休日の日付/ルールをデータベースに入力するか、ルールを使用して、予定の日付が、予定がスケジュールされている休日の日/週に該当するかどうかを判断するのが最善でしょうか?

データベースが答えである場合は、データベースの設計とイベントの繰り返しを設定する方法についてサポートが必要です。ルールベースの場合は、それについてもサポートが必要です(たとえば、春休み、イースターなどの時期を決定する)。

私はMSSQL2005(まもなくmssql 2008に移行する可能性があります)とColdFusion9を使用しています。

TIA

4

4 に答える 4

3

私は先月、多くの米国の祝日を支援するためにUDFを作成しましたが、すべてを網羅しているわけではありません。これはあなたにまともなスタートを与えるはずです。

イースターの日を迎えるCFLibのこのUDFを使用することもできます

記念日が終わったら、簡単なことをして、dateadd()1日と2日を取り除いて完全な週末を過ごすことができます。

<cffunction name="getUSBankHolidays" access="public" output="false" returntype="struct" hint="general bank holidays for US">
  <cfargument name="iYear" default="#Year(now())#" />

    <cfset var currentYear = arguments.iYear />

    <!--- Static dates per year --->
    <cfset var strResult = 
      { NewYears1      = createDate(currentYear,12,30),
        NewYears2      = createDate(currentYear,12,31),
        NewYears3      = createDate(currentYear,1,1),
        NewYears4      = createDate(currentYear,1,2),
        Independence   = createDate(currentYear,7,4),
        Christmas1     = createDate(currentYear,12,22),
        Christmas2     = createDate(currentYear,12,23),
        Christmas3     = createDate(currentYear,12,24),
        Christmas4     = createDate(currentYear,12,25),
        Christmas5     = createDate(currentYear,12,26),
        Christmas6     = createDate(currentYear,12,27),
        Christmas7     = createDate(currentYear,12,28)
  } />

    <cfset strResult.SpringBreak          = createDate(currentYear,3,GetNthOccOfDayInMonth(3,1,3,currentYear)) />
    <cfset strResult.MemorialDay          = createDate(currentYear,5,(DaysInMonth(createDate(2012,5,1))) - (DayOfWeek(createDate(2012,5,DaysInMonth(createDate(2012,5,1)))) - 2)) />
    <cfset strResult.LaborDay             = createDate(currentYear,9,GetNthOccOfDayInMonth(1,2,9,currentYear)) />
    <cfset strResult.Thanksgiving         = createDate(currentYear,11,GetNthOccOfDayInMonth(4,6,11,currentYear)) />

    <cfreturn strResult />
</cffunction>

<cfdump var="#getUSBankHolidays()#">

<!-- This code will tell you if the date is holiday or not --->
<cfset Today = '2012-01-01' />
<cfdump var="#NOT arrayIsEmpty(structFindValue(getUSBankHolidays(),createDate(year(Today),month(Today),day(Today))))#">

また、1か月にn回目の出現を取得するには、CFLib.orgからこのUDFが必要になります。

于 2012-12-13T19:03:37.673 に答える
1

データベーステーブルを使用すると、柔軟性が大幅に向上します。

私が管理しているデータウェアハウスには、主キーの日付を持つ期間というテーブルがあります。他のフィールドには、休日、いくつかの会計年度のもの、および私たちにとって重要な他のいくつかのフィールドが含まれます。他のテーブルには、テーブルへの外部キー参照があります。

このテーブルでは、必要なレポートを簡単に生成できるだけでなく、左結合を使用して、何かが発生しなかった日付を特定することもできます。そのような何かがあなたの状況で役立つかもしれません。

更新に関しては、手動で行います。クリスマスのようなものが週末になると、金曜日と月曜日のどちらが休みになるかが通知されるのを待ちます。

于 2012-12-13T19:55:19.307 に答える
0

私の意見では、それをコードに入れます。私はこれを数年前に見つけ、ライセンス契約に従って使用しました。Javaベースですが、必要に応じてColdfusionに変更できると確信しています。現在、66の休日のコードがリストされており、必要な週を計算するためにいくつか操作できることを確認してください。

http://mindprod.com/applet/holidays.html

http://mindprod.com/precis/holidays.txt

https://wush.net/websvn/mindprod/listing.php?repname=mindprod&path=%2Fcom%2Fmindprod%2Fholidays%2F

于 2012-12-13T18:58:48.723 に答える
0

これは私が最終的に使用したものであり、将来変更するのに十分な柔軟性があり、将来の日付を追加するためのGUIを備えたデータベース駆動型システムに変換する可能性がありますが、今のところ、これはうまく機能します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
<link rel="stylesheet" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" /> 
<script src="http://code.jquery.com/jquery-1.8.3.js"></script> 
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script> 
<link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css" /> 
<script> 
$(document).ready(function(){ 
  $( ".datepicker" ).datepicker({ 
    changeMonth: true, 
    changeYear: true 
  }); 
}); 
</script> 
</head> 

<body> 
<cfoutput> 
<form action="#cgi.SCRIPT_NAME#" method="post"> 
  Start Date: <input type="text" name="StartDate" class="datepicker" /> (mm-dd-yyyy)<br /> 
  End Date: <input type="text" name="EndDate" class="datepicker" /> (mm-dd-yyyy) <br /> 
  <input type="submit" value="Save Appointment" /> 
</form> 
<cfif structkeyexists(form,'startDate')> 
<cfdump var="#form#" expand="no"> 
<hr /> 
<cfscript> 
/** 
* Returns the day of the month(1-31) of an Nth Occurrence of a day (1-sunday,2-monday etc.)in a given month. * 
* @param NthOccurrence      A number representing the nth occurrence.1-5. 
* @param TheDayOfWeek      A number representing the day of the week (1=Sunday, 2=Monday, etc.). 
* @param TheMonth      A number representing the Month (1=January, 2=February, etc.). 
* @param TheYear      The year. 
* @return Returns a numeric value. 
* @author Ken McCafferty (mccjdk@yahoo.com) 
* @version 1, August 28, 2001 
*/
function GetNthOccOfDayInMonth(NthOccurrence,TheDayOfWeek,TheMonth,TheYear) 
{
  Var TheDayInMonth=0; 
  if(TheDayOfWeek lt DayOfWeek(CreateDate(TheYear,TheMonth,1))){ 
    TheDayInMonth= 1 + NthOccurrence*7  + (TheDayOfWeek - DayOfWeek(CreateDate(TheYear,TheMonth,1))) MOD 7; 
  } 
  else { 
    TheDayInMonth= 1 + (NthOccurrence-1)*7  + (TheDayOfWeek - DayOfWeek(CreateDate(TheYear,TheMonth,1))) MOD 7; 
  } 
  //If the result is greater than days in month or less than 1, return -1
  if(TheDayInMonth gt DaysInMonth(CreateDate(TheYear,TheMonth,1)) OR   TheDayInMonth lt 1){ 
    return -1; 
  } 
  else { 
    return TheDayInMonth; 
  } 
} 
/** 
* Returns the date for Easter in a given year.
* Minor edits by Rob Brooks-Bilson (rbils@amkor.com).
* 
* @param TheYear      The year to get Easter for. 
* @return Returns a date object. 
* @author Ken McCafferty (rbils@amkor.commccjdk@yahoo.com) 
* @version 1, September 4, 2001 
*/
function GetEaster() {
  Var TheYear=iif(arraylen(arguments) gt 0,"arguments[1]", "Year(Now())"); 
  Var century = Int(TheYear/100);
  Var G = TheYear MOD 19;
  Var K = Int((century - 17)/25);
  Var I = (century - Int(century/4) - Int((century - K)/3) + 19*G + 15) MOD 30;
  Var H = I - Int((I/28))*(1 - Int((I/28))*Int((29/(I + 1)))*Int(((21 - G)/11)));
  Var J = (TheYear + Int(TheYear/4) + H + 2 - century + Int(century/4)) MOD 7;
  Var L = H - J;
  Var EasterMonth = 3 + Int((L + 40)/44);
  Var EasterDay = L + 28 - 31*Int((EasterMonth/4));
  return CreateDate(TheYear,EasterMonth,EasterDay);
}

function LastDayOfMonth(strMonth) {
  var strYear=Year(Now());
  if (ArrayLen(Arguments) gt 1)
    strYear=Arguments[2];
  return DateAdd("d", -1, DateAdd("m", 1, CreateDate(strYear, strMonth, 1))); 
}
</cfscript>

<cfset StartYear = listlast(StartDate,'/')>
<cfset EndYear = listlast(endDate,'/')>
<cfset HolidaySchedule = structnew()>
<cfloop index="currentYear" from="#dateformat(StartDate,'yyyy')#" to="#dateformat(EndDate,'yyyy')#" step="1"> 
<cfset val = StructInsert( HolidaySchedule, "Independence (#currentYear#)", createDate(currentYear,7,4) )/> 
<cfset val = StructInsert( HolidaySchedule, "New Year (#currentYear#)", createdate(currentYear,1,1) )/> 
<cfset val = StructInsert( HolidaySchedule, "Easter (#currentYear#)", GetEaster(currentYear) )/> 
<cfset val = StructInsert( HolidaySchedule, "Spring Break (#currentYear#)", createDate(currentYear,3,GetNthOccOfDayInMonth(2,2,3,currentYear)) )/>
<cfset val = StructInsert( HolidaySchedule, "Labor Day (#currentYear#)", createDate(currentYear,9,GetNthOccOfDayInMonth(1,2,9,currentYear)) )/>
<cfset val = StructInsert( HolidaySchedule, "Thanksgiving (#currentYear#)", createDate(currentYear,11,GetNthOccOfDayInMonth(4,6,11,currentYear)) )/>
<cfset val = StructInsert( HolidaySchedule, "Christmas Day (#currentYear#)", createdate(currentYear,12,25) )/>
</cfloop>
<cfdump var="#HolidaySchedule#" expand="no">
<cfset normalweek = 'true'>
<cfloop index="x" from="#startDate#" to="#endDate#" step="1">
Checking date: #dateformat(x,'yyyy-mm-dd')#<br />
<cfif NOT arrayIsEmpty(structFindValue(HolidaySchedule,createDate(year(x),month(x),day(x))))> 
<div style="background-color:##009900; color:##ffffff">#dateformat(x, 'mm/dd/yyyy')# is a holiday.</div> 
<cfset normalweek = 'false'>
</cfif>
</cfloop>

<cfif normalweek eq 'false'>
Remember to add on the Holiday Fee.
<cfelse>
No additional charges for this appointment.
</cfif>
</cfif>
</cfoutput>
</body>
</html>
于 2012-12-14T16:37:01.753 に答える