2011-06-22 13 views
1

就業日を教えてくれる内蔵機能はありますか?これは私が意味するところです特定の日付の就業日の曜日はどれですか

今日の日付(2011年6月14日)を選択すると、今日の検査番号が表示されます。このリードタイムには週末が含まれます。ですから、顧客が10日(金曜日)にプロジェクトを開始して今日終了した場合、それは約3日ではなく約5日かかったことを示すでしょう。

答えて

1

これまで長いことこれを行う機能があったと思いますが、その機能は削除されていると思います。私はあなたが2つの日付の間営業日を計算し、次のようなものを使用することができるはずと信じています:

DateDiff ("d", {Orders.OrderDate}, {Orders.ShipDate}) - 
DateDiff ("ww", {Orders.OrderDate}, {Orders.ShipDate}, crSaturday) - 
DateDiff ("ww", {Orders.OrderDate}, {Orders.ShipDate}, crSunday) 

これは総日数差を取得し、合計から土日を減算します。休日は含まれていないことに注意してください。そのためには、独自のUser Function Libraryでそれらを維持し、それらを計算に含める必要があります。

これが役に立ちます。

+0

私は同じ問題に遭遇しました。私は以下の解決策にいくつかの問題を発見しました。これはより良い全体的なソリューションのように見えます。 – zach

0

これは私が思いついた解決策です。かなり多くの場合7日以上私は何日減算するか知っている何かです。 7日未満の場合は、週末にまたがっているかどうかは分かります。 Crystalレポートには、DayOfWeekという関数があります。この関数は、日曜日、つまり日曜日= 1、月曜日= 2などの数値を返します。終了時刻の日数が週末を過ぎたことがわかっている開始時刻よりも小さい場合。 2を引くことができます。

timeDiffは開始日 - 終了日です。

if({@timeDiff} >= 35) then 
{@timeDiff} - 10 
else if({@timeDiff} >= 28) then 
{@timeDiff} - 8 
else if({@timeDiff} >= 21) then 
{@timeDiff} - 6 
else if({@timeDiff} >= 14) then 
{@timeDiff} - 4 
else if({@timeDiff} >= 7) then 
{@timeDiff} - 2 
else if(DayOfWeek({Command.Finishdate}) < DayOfWeek({Command.Startdate})) then 
{@timeDiff} - 2 
else 
{@timeDiff} 

私のウェブサイトでは、より深い説明があります。リンクはここhere

+0

これは上のものと同様に動作しません! – zach

+0

リンクが壊れています... –

0

でも考慮に祝日をとるモンスターソリューションです:

// WorkingDays 
// Count the number of working days between a start and an end date. 
// 
// startDate - first date in the interval 
// endDate - last date in the interval 
// countStartAndEnd - if true 1 feb to 2 feb will count as 2 days 
//     if false 1 feb to 2 feb will count as 1 day 
//     given both of them are working days 
Function (dateVar startDate, dateVar endDate, optional booleanVar countStartAndEnd := False) 

local NumberVar Weeks; 
local NumberVar Days; 
local NumberVar Hol; 

// 5 days for every week (whole or partial) 
Weeks := (Truncate (endDate - dayofWeek(endDate) + 1 - (startDate - dayofWeek (startDate) + 1)) /7) * 5; 
// Number of days in partial weeks (can be positive or negative) 
Days := DayOfWeek(endDate) - DayOfWeek(startDate) + 1 + 
(if DayOfWeek(startDate) = crSunday then -1 else 0) + 
(if DayOfWeek(endDate) = crSaturday then -1 else 0); 

// Count number of public holidays in the period 
local NumberVar iYear; 
local NumberVar i; 
for iYear := Year(startDate) to Year(endDate) do (
    Local DateVar Array Holidays := getHolidays(iYear); 
    for i := 1 to uBound(Holidays) do (
     local NumberVar hMonth := Month(Holidays[i]); 
     local NumberVar hDay := Day(Holidays[i]); 
     local DateVar hDate := cDate(iYear, hMonth, hDay); 
     if DayOfWeek(hDate) in crMonday to crFriday and 
      hDate in startDate to endDate then Hol := Hol+1; 
     ); 
    ); 

// Return number of working days 
Weeks + Days - Hol - toNumber(not countStartAndEnd); 

コードKenHamadyで見つけた溶液から変更上記の。

次の関数は、前の関数によって呼び出され、すべての祝日を返します:

// getHolidays 
// Returns an array with all public holidays for a given year 
// These are Swedish holidays. Modify as needed. 
Function (Numbervar yyyy) 

Datevar Array holidays; 
local Datevar holiday; 
local Datevar easterSunday := getEasterSunday(yyyy); 

// New Years Day 
// 1 jan 
holiday:=Date(yyyy, 1, 1); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Epiphany 
// 6 jan 
holiday:=Date(yyyy, 1, 6); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Good Friday 
// 2 days before easter sunday 
holiday:=cDate(DateAdd("d", -2, easterSunday)); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Holy Saturday 
// 1 day before easter sunday 
holiday:=cDate(DateAdd("d", -1, easterSunday)); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Easter Sunday 
// The first Sunday following the first ecclesiastical full moon that occurs on or after the day of the vernal equinox 
holiday:=cDate(DateAdd("d", -2, easterSunday)); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Easter Monday 
// 1 day after easter sunday 
holiday:=cDate(DateAdd("d", 1, easterSunday)); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Labour day 
// 1 may 
holiday:=Date(yyyy, 5, 1); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Ascension 
// 39 days after easter sunday 
holiday:=cDate(DateAdd("d", 39, easterSunday)); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// National day 
// 6 june 
holiday:=Date(yyyy, 6, 6); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Midsummer's eve 
// The friday in the interval 19 june - 25 june 
holiday:=cDate(DateAdd("d", 1-dayOfWeek(Date(yyyy, 6, 25), crFriday), Date(yyyy, 6, 25))); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// All saints' day 
// The saturday in the interval 31 october - 6 november 
holiday:=cDate(DateAdd("d", 1-dayOfWeek(Date(yyyy, 11, 6), crSaturday), Date(yyyy, 11, 6))); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Christmas eve 
// 24 december 
holiday:=Date(yyyy, 12, 24); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// Chritmas day 
// 25 december 
holiday:=Date(yyyy, 12, 25); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// St. Stephen's Day 
// 26 december 
holiday:=Date(yyyy, 12, 26); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

// New year's eve 
// 31 december 
holiday:=Date(yyyy, 12, 31); 
Redim Preserve holidays[Ubound(holidays)+1]; 
holidays[Ubound(holidays)]:=holiday; 

holidays; 

コード上記craigによってthis postでカスタム関数に基づきます。

休日の関数は、指定した年のために復活祭の日曜日の日付を取得できるようにする必要があります:United States Naval Observatoryから

// getEasterSunday 
// Returnes a dateVar of the easter sunday for a given year 
// 
// Based upon formula from http://aa.usno.navy.mil/faq/docs/easter.php 
Function (numberVar yyyy) 

local numberVar c := int(yyyy/100); 
local numberVar n := yyyy - 19 * int(yyyy/19); 
local numberVar k := int((c-17)/25); 
local numberVar i := c - int(c/4) - int((c-k)/3) + 19*n + 15; 
i := i - 30 * int(i/30); 
i := i - int(i/28) * (1 - int(i/28) * int(29/(i+1)) * int((21-n)/11)); 
local numberVar j := yyyy + int(yyyy/4) + i + 2 - c + int(c/4); 
j := j - 7 * int(j/7); 
local numberVar l := i - j; 
local numberVar m := 3 + int((l+40)/44); 
local numberVar d := l + 28 - 31 * int(m/4); 

cDate(yyyy, m , d); 

イースター日曜日の計算式。

関連する問題