function BusinessDaysSinceFixedDate (const nDate : tDateTime) : integer;
const
Map : array [ -6 .. 6 ] of integer
= ( 0, 0, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 9);
var
X : integer;
begin
X := trunc (nDate);
Result := 5 * (X div 7) + Map [ X mod 7 ];
end;
function BusinessDaysBetweenDates (const nStartDate : tDateTime;
const nEndDate : tDateTime) : integer;
begin
Result := BusinessDaysSinceFixedDate (nEndDate)
- BusinessDaysSinceFixedDate (nStartDate);
end;
Il BusinessDaysSinceFixedDate di routine calcola il numero di giorni lavorativi dal momento che una data fissa. La data specifica, che è irrilevante, è lunedì 25 dicembre 1899. Conta semplicemente il numero di settimane trascorse (X div 7) e lo moltiplica per 5. Quindi aggiunge un offset per correggere in base al giorno della settimana. noti che (X mod 7) restituirà un valore negativo per una data negativa, cioè una data prima del 30 dicembre 1899.
I BusinessDaysBetweenDates di routine chiama semplicemente BusinessDaysSinceFixedDate per la data di inizio e di fine e sottrae uno dall'altro.
fonte
2013-02-13 16:43:42
Vedo grazie ... Non ho bisogno di vacanze perché non influenzano in modo significativo i tempi di consegna..ma i fine settimana sono un problema. Darò un colpo. – Sardukar
Ho usato quasi la stessa funzione ... funziona alla grande. ci sono anche gli esemplari, quindi se pochi hanno problemi con le vacanze non incideranno sul generale ... grazie. – Sardukar
Sarebbe bello farlo senza un ciclo. –