MySQL函数查找两个日期之间的工作日数

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

计算开始日期@S和结束日期@E之间的工作日数。

假设结束日期(@E)不在开始日期之前(@S)。与DATEDIFF兼容,因为相同的开始日期和结束日期为零工作日。忽略假期。

数字串的构造如下。创建一个开始日和结束日的表,行必须以星期一(WEEKDAY 0)开头,列也必须以星期一开始。从左上角到右下角填写对角线,全部为0(即星期一到星期一,星期二和星期二之间有0个工作日,等等)。对于每天从对角线开始(必须始终为0)并填写右侧的列,一次一天。如果您在周末(非工作日)列登陆,则工作日数不会更改,而是从左侧开始。否则,工作日数会增加一个。当你到达行循环的末尾回到同一行的开头并继续直到你再次到达对角线。然后继续下一行。

例如,假设周六和周日不是工作日 -

| 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个值连接到字符串中。

如果您发现任何错误,请告诉我。

-Edit改进表:

| 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)

转自:http://www.imooc.com/wenda/detail/582252

自己码下做个笔记,如有侵权等请联系我,立即删除!

你可能感兴趣的:(MySQL)