Business Central working with dates
I want to report some information collected from several parts on the calculation of dates through dateformula
and calcdate, since they are very used. It could be useful, especially for those new to Business Central.
Assumptions
C = Current
D = Day
W = Week
M = Month
Q = Quarter
Y = Year
CD = Current Day
CW = Current week
CM = Current month
CM -> last date of the current month
<-CM> -> first date of the current month
+D -> example to the first date of next month
-1M -> example going back one month
Combinations
10D = 10 days from today
2W = 2 weeks from today
D10 = The next 10th day of a month
WD4 = The next 4th day of a week (Thursday)
CM+10D = Current month + 10 days
-1Y = 1 year ago from today
Calculation example – firts & last days
First day of the month: <-CM>
Last day of the month: <+CM>
Last day of next month: <+1M+CM>
CalcDate
NewDate := CALCDATE(DateExpression [, Date])
DateExpression = [][][]
= []
= + | –
= | |
= Positive integer
= D | WD | W | M | Q | Y (D=day, WD=weekday, W=week, M=month, Q=quarter, Y=year)
= C (C=current)
These production rules show that date expressions consist of zero, one, two, or three subexpressions.
Each subexpression consists of an optional sign and a term.
The following are some typical examples of terms:
30D (30 days; corresponds to )
WD2 (weekday number 2; corresponds to )
CW (current week; corresponds to )
The internal calendar of Dynamics NAV starts on Monday and ends on Sunday. This means that Monday is weekday 1 and Sunday is weekday 7.
Examples
Expr1 := ”; // Current quarter + 1 month – 10 days
Expr2 := ‘<-WD2>’; // The last weekday no.2, (last Tuesday)
Expr3 := ”; // Current month + 30 days
RefDate := 052196D;
Date1 := CALCDATE(Expr1, RefDate);
Date2 := CALCDATE(Expr2, RefDate);
Date3 := CALCDATE(Expr3, RefDate);
MESSAGE(Text000 + Text001 + Text002 + Text003,
RefDate, Expr1, Date1, Expr2, Date2, Expr3, Date3);
https://docs.microsoft.com/en-us/dynamics-nav/calcdate-function–date-
Function example
CheckMonthDayFromDate
codeunit 50001 “CheckEndofMonthfromDate”
{
//CheckEndofMonth
procedure CheckEndMonth(pDate: Date): Boolean
var
ClosingDate: Date;
begin
ClosingDate := CALCDATE(”, pDate);
IF pDate = ClosingDate THEN
exit(true);
exit(false);
end;
}
Good day Roberto
Thank you so much for this blog and informative post – it really made sense of the calculations as we are new to BC and it was a constant source of misunderstandings and confusion.
Could I ask you how to correct Posted documents after I updated payment terms?
It does not seem to have applied my changes after correcting them.
Much appreciated
Kind regards
Eugene – South Africa