这个表达式 –
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
计算开始日期@S和结束日期@E之间的工作日数。
假设结束日期(@E)不在开始日期(@S)之前。
与DATEDIFF兼容,具有相同的开始日期和结束日期
给出零个工作日。
忽略假日。
数字串构造如下。创建一个表
开始日期和结束日期,行必须以monday(WEEKDAY)开头
0),列也必须以星期一开始。填写
对角线从左上到右下,全部为0(即有0
工作日在周一至周一,周二和周二等)。
对于每一天从对角线开始(必须始终为0)并填写
列向右,一次一天。如果你登陆
周末日(非工作日)列,工作日的天数
不改变,它从左边携带。否则,数字
的工作日增加1。当你到达的尽头
行循环回到同一行的开始,并继续,直到你
再次到达对角线。然后进入下一行。
例如。假设星期六和星期日不是工作日 –
| M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0
然后将表中的49个值连接到字符串中。
请让我知道,如果你发现任何错误。
-编辑
改进表:
| M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0
改进的字符串:’0123444401233334012222340111123400001234000123440′
改进表达:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)