Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Função MySQL para encontrar o número de dias úteis entre duas datas


Esta expressão -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

calcula o número de dias úteis entre a data de início @S e a data de término @E.

Assume-se que a data de término (@E) não é anterior à data de início (@S). Compatível com DATEDIFF, pois a mesma data de início e data de término fornece zero dias úteis. Ignora feriados.

A cadeia de dígitos é construída da seguinte forma. Crie uma tabela de dias de início e dias de término, as linhas devem começar com segunda-feira (WEEKDAY0) e as colunas também devem começar com segunda-feira. Preencha a diagonal do canto superior esquerdo para o canto inferior direito com todos os 0 (ou seja, há 0 dias úteis entre segunda e segunda, terça e terça, etc.). Para cada dia comece na diagonal (deve ser sempre 0) e preencha as colunas até o certo, um dia de cada vez. Se você pousar em uma coluna de dia de fim de semana (dia não útil), o número de dias úteis não muda, ele é carregado da esquerda. Caso contrário, o número de dias úteis aumenta em um. Quando você chegar ao final da linha, volte para o início da mesma linha e continue até chegar à diagonal novamente. Em seguida, vá para a próxima linha.

Por exemplo. Supondo que sábado e domingo não sejam dias úteis -
 | 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

Em seguida, concatene os 49 valores da tabela na string.

Por favor, deixe-me saber se você encontrar algum bug.

-Tabela editada melhorada:
 | 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

string aprimorada:'0123444401233334012222340111123400001234000123440'

expressão melhorada:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)