Find the number of workdays between two dates (From & To) for Weekends given in column E. Blank in To field means Current Date. Blank in Weekend field means Sat, Sun. The answers shown where To dates are blanks are for 23-Mar-2023. Hence, your answer for these rows may differ. The dates are in US format, so depending upon your locale, you may need to convert column C and D in your locale’s date format before making the formula.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 157
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Workday Count Between Dates with Power Query
Power Query solution 1 for Workday Count Between Dates, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
NWD = Table.AddColumn(
Source,
"Custom",
each
let
D = List.Transform(
List.Generate(
() => [From],
(d) => d <= ([To] ?? DateTime.LocalNow()),
each Date.AddDays(_, 1)
),
each DateTime.ToText(_, "ddd")
)
in
List.Count(List.RemoveMatchingItems(D, Text.Split([Weekend] ?? "Sat, Sun", ", ")))
)
in
NWD
Power Query solution 2 for Workday Count Between Dates, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
ReplacedCurrentDate = Table.ReplaceValue(Source,null,DateTime.LocalNow(),Replacer.ReplaceValue,{"To"}),
ReplacedSatSun = Table.ReplaceValue(ReplacedCurrentDate,null,"Sat, Sun",Replacer.ReplaceValue,{"Weekend"}),
FomatFromToAsDate = Table.TransformColumnTypes(ReplacedSatSun,{{"To", type date}, {"From", type date}}),
AddedWorkdays = Table.AddColumn(FomatFromToAsDate, "Workdays", each List.Accumulate(
List.Transform(List.Dates([From], Duration.Days([To] - [From]) + 1, hashtag#duration(1, 0, 0, 0)), each Text.Start(Date.DayOfWeekName(_, "en-US"), 3)),
0,
(s, d) => s + (if List.Contains(Text.Split([Weekend], ", "), d) then 0 else 1))),
Solution = AddedWorkdays[[Workdays]]
in
Solution
Power Query solution 3 for Workday Count Between Dates, proposed by Aditya Kumar Darak 🇮🇳:
let
NetWorkDays = ( start_date, end_date, weekend ) =>
let
From = Date.From ( start_date ),
To = Date.From ( end_date ?? DateTimeZone.UtcNow() ),
Wknd = weekend ?? "Sat, Sun",
Dates = List.Dates ( From, Number.From ( To - From ) + 1, hashtag#duration ( 1, 0, 0, 0 ) ),
Filter = List.Select (
Dates,
( f ) => not Text.Contains ( Wknd, Date.ToText ( f, "ddd" ) )
),
Cnt = List.Count ( Filter )
in
Cnt,
Source = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
Return = Table.AddColumn (
Source,
"Workdays",
each NetWorkDays ( [From], [To], [Weekend] )
)
in
Return
Power Query solution 4 for Workday Count Between Dates, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"To", type date}, {"From", type date}}),
NoNull = Table.TransformColumns(#"Changed Type", {{"To", each if _ = null then hashtag#date(2023,3,23) else _}, {"Weekend", each if _ = null then "Sat, Sun" else _}}),
Days = Table.AddColumn(NoNull, "Days", each
let
b = Text.Split([Weekend], ", "),
c =List.Transform({Number.From([From])..Number.From([To])}, each Text.Start(Date.DayOfWeekName(Date.From(_), "en-US"),3)),
d = List.Count(List.RemoveMatchingItems(c,b))
in d) [[Days]]
in
Days
Power Query solution 5 for Workday Count Between Dates, proposed by Jan Willem Van Holst:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XZDNCsIwEIRfpeScQJJa7bUHPfTHSxQPpYdFCw1oWmqL+PZuVmJVCJtJ+Gaym7pmFYxPxpkZwDrclVBCS61R6kQkQe9GyyMDE5bZsYbXbA9TB95xzLZYkQwsrkM38wg9RJZt7zGT+Uy95MdSrIPGVB5V/Tu6tHfAuxwGekDLn2xCDFztDQ/F/AA7+TAl4gCpVKT/jZMr7zvquKBBVx9eKPnVCKGZcy3ZwZ292Cx/gevUXniEQ7KmeQE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Emp = _t, Country = _t, From = _t, To = _t, Weekend = _t]),
Replace1 = Table.ReplaceValue(Source,"",DateTime.Date(DateTime.LocalNow()) ,Replacer.ReplaceValue,{"To"}),
Replace2 = Table.ReplaceValue(Replace1,"","Sat, Sun",Replacer.ReplaceValue,{"Weekend"}),
Changed = Table.TransformColumnTypes(Replace2,{{"From", type date}, {"To", type date}}),
Result = Table.AddColumn(Changed, "Answer", (x)=>
let
Dates = List.Dates(x[From], Duration.Days(x[To]-x[From])+1, hashtag#duration(1,0,0,0)),
transform = List.Transform(Dates, each Text.Start(Date.DayOfWeekName(_),3 )),
Remove = Text.Split(x[Weekend], ", "),
removeWeekend = List.RemoveItems(transform, Remove)
in
List.Count(removeWeekend)
)
in
Result
Solving the challenge of Workday Count Between Dates with Excel
Excel solution 1 for Workday Count Between Dates, proposed by Bo Rydobon 🇹🇭:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(f,t,w,NETWORKDAYS.INTL(f,IF(t,t,TODAY()),CONCAT(COUNTIF(w,"*"&TEXT(SEQUENCE(7)+1,"ddd")&"*")))))
Excel solution 2 for Workday Count Between Dates, proposed by Bo Rydobon 🇹🇭:
=NETWORKDAYS.INTL(+C2:C8,IF(D2:D8,D2:D8,TODAY()),MAP(E2:E8,LAMBDA(w,IF(w>0,CONCAT(COUNTIF(w,"*"&TEXT(SEQUENCE(7)+1,"ddd")&"*")),))))
Excel solution 3 for Workday Count Between Dates, proposed by John V.:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(f,t,w,NETWORKDAYS.INTL(f,IF(t,t,NOW()),IF(w>0,CONCAT(COUNTIF(w,TEXT(ROW(2:8),"*ddd*"))),))))
Excel solution 4 for Workday Count Between Dates, proposed by محمد حلمي:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(a,b,c,
NETWORKDAYS.INTL(
a,
MIN(b,TODAY()),
CONCAT(--ISNUMBER(FIND(TEXT(
SEQUENCE(7,,2),"ddd"),IF(c>0,c,"Sat Sun")))))))
Excel solution 5 for Workday Count Between Dates, proposed by محمد حلمي:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(a,b,c,
NETWORKDAYS.INTL(a,IF(b,b,TODAY()),
CONCAT(--ISNUMBER(
FIND(TEXT(SEQUENCE(7,,2),"ddd"),
IF(LEN(c),c,"Sat, Sun")))))))
Excel solution 6 for Workday Count Between Dates, proposed by 🇰🇷 Taeyong Shin:
=MAP(C2:C8, D2:D8, E2:E8,
LAMBDA(f,t,w,
LET(
d, TEXT(SEQUENCE(7) + 1, "ddd"),
week, CONCAT(COUNTIF(w, "*" & d & "*")),
NETWORKDAYS.INTL(f, MIN(TODAY(), t), IF(w > 0, week, 1))
)
))
Excel solution 7 for Workday Count Between Dates, proposed by Aditya Kumar Darak 🇮🇳:
=MAP(
C2:C8,
D2:D8,
E2:E8,
LAMBDA(a, b, c,
LET(
_fto, IF(b = "", TODAY(), b),
_dys, TEXT(SEQUENCE(7, , 2), "ddd"),
_cfg, CONCAT(COUNTIFS(c, "*" & _dys & "*")),
_fcfg, IF(c = "", 1, _cfg),
_r, NETWORKDAYS.INTL(a, _fto, _fcfg),
_r
)
)
)
Excel solution 8 for Workday Count Between Dates, proposed by Hussein SATOUR:
=MAP(C2:C8,D2:D8,E2:E8, LAMBDA(x,y,z, SUM(LET(a, SEQUENCE(IF(ISBLANK(y), TODAY(), y)-x+1,,x), IF(ISERR(FIND(TEXT(a, "ddd"), IF(ISBLANK(z), "Sat, Sun",z))), 1, 0)))))
Excel solution 9 for Workday Count Between Dates, proposed by Md. Zohurul Islam:
=LET(u,A2:B8,v,C2:C8,w,D2:D8,z,E2:E8,
p,IF(w="",TODAY(),w),
q,IF(z="","Sat "&"Sun",z),
s,MAP(p,v,q,LAMBDA(x,y,z,LET(
a,TEXT(SEQUENCE(x-y+1,,y),"ddd"),
b,TEXTSPLIT(z,", "),
c,SUM(BYROW(ABS(a=b),SUM)),
d,COUNTA(a)-c,
d))),
s)
Excel solution 10 for Workday Count Between Dates, proposed by Charles Roldan:
=LET(_WEEKEND,LAMBDA(String,
CONCAT(--ISNUMBER(FIND(TEXT(SEQUENCE(,7,2),"Ddd"),String)))),
MAP(C2:C8,D2:D8,E2:E8,LAMBDA(From,To,Weekend,
NETWORKDAYS.INTL(From,IF(To,To,TODAY()),_WEEKEND(Weekend)))))
Excel solution 11 for Workday Count Between Dates, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=>Cmt,
Sun=>Paz,
"ddd"=>"ggg"
=MAP(C2:C8;D2:D8;E2:E8;LAMBDA(x;y;z;IF(AND(y<>"";z<>"");DAYS(y;x)+1-SUM(IFERROR(FIND(TRANSPOSE(TEXTSPLIT(z;", "));TEXT(SEQUENCE(;y-x+1;x;1);"ggg");1);""));IF(AND(y="";z<>"");DAYS(TODAY();x)+1-SUM(IFERROR(FIND(TRANSPOSE(TEXTSPLIT(z;", "));TEXT(SEQUENCE(;TODAY()-x+1;x;1);"ggg");1);""));IF(AND(y="";z="");DAYS(TODAY();x)+1-SUM(IFERROR(FIND(TRANSPOSE(TEXTSPLIT(("Cmt, Paz");", "));TEXT(SEQUENCE(;TODAY()-x+1;x;1);"ggg");1);""));"")))))
Excel solution 12 for Workday Count Between Dates, proposed by Guillermo Arroyo:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(c,d,e,LET(w,IF(e="",{"Sat","Sun"},TEXTSPLIT(e,", ")),SUM(1-MMULT(--(WEEKDAY(SEQUENCE(IF(d="",TODAY(),d)-c+1,,c))=TRANSPOSE(MMULT(--(TEXT(SEQUENCE(7),"ddd")=w),SEQUENCE(COUNTA(w),,1,0))*SEQUENCE(7))),SEQUENCE(7,,,0))))))
More simple
=NETWORKDAYS.INTL(C2:C8*1,IF(D2:D8,D2:D8,TODAY()),MAP(G2:G8,LAMBDA(a,IF(a<>"",CONCAT(--ISNUMBER(SEARCH(TEXT(ROW(2:8),"ddd"),a))),"0000011"))))
Excel solution 13 for Workday Count Between Dates, proposed by Anup Kumar:
=LET(
fromDate, C2,
toDate, IF(D2>1,D2,TODAY()),
days, TEXT(SEQUENCE(7,,45005,1),"ddd"),
offDays, IF(ISBLANK(E2),{"Sat";"Sun"},TEXTSPLIT(E2,,", ")),
weekstr, CONCAT(--ISNUMBER(XMATCH(days,offDays,0))),
NETWORKDAYS.INTL(fromDate,toDate,weekstr)
)
Excel solution 14 for Workday Count Between Dates, proposed by Gabriel Raigosa:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(f,t,w,NETWORKDAYS.INTL(f,IF(t,t,TODAY()),TEXTJOIN(,,1*ISNUMBER(XMATCH({"Mon","Tue","Wed","Thu","Fri","Sat","Sun"},IF(w>0,TEXTSPLIT(w,", "),{"Sat","Sun"})))))))
▶️ ES:
=MAP(C2:C8,D2:D8,E2:E8,LAMBDA(f,t,w,DIAS.LAB.INTL(f,SI(t,t,HOY()),UNIRCADENAS(,,1*ESNUMERO(COINCIDIRX({"Mon","Tue","Wed","Thu","Fri","Sat","Sun"},SI(w>0,DIVIDIRTEXTO(w,", "),{"Sat","Sun"})))))))
Excel solution 15 for Workday Count Between Dates, proposed by roberto mensa:
=NETWORKDAYS.INTL(INDEX(C2:C8,SEQUENCE(7)),INDEX(IF(ISBLANK(D2:D8),TODAY(),D2:D8),SEQUENCE(7)),MID(CONCAT(--ISNUMBER(FIND(TEXT(SEQUENCE(,7,2),"ddd"),IF(ISBLANK(E2:E8),"Sat, Sun",E2:E8)))),SEQUENCE(ROWS(C2:C8),,1,7),7))
Excel solution 16 for Workday Count Between Dates, proposed by roberto mensa:
=NETWORKDAYS.INTL(INDEX(C2:C8,SEQUENCE(7)),INDEX(IF(ISBLANK(D2:D8),TODAY(),D2:D8),SEQUENCE(7)),MID(CONCAT(--ISNUMBER(FIND(MID("MonTueWedThuFriSatSun",SEQUENCE(,7,,3),3),IF(ISBLANK(E2:E8),"Sat, Sun",E2:E8)))),SEQUENCE(ROWS(C2:C8),,1,7),7))
&&&
