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

Retrocesso em datas sem fins de semana


Podemos utilizar DayName() função para obter o nome do dia da semana correspondente a uma data. Usaremos o resultado desta função para restringir fins de semana por NOT IN ('Saturday', 'Sunday') .

Além disso, precisaremos aumentar o intervalo do gerador de números até 10 . Porque existe a possibilidade de nos depararmos com 2 fins de semana (total de 4 dias) em ambos os lados de 5 dias da semana.

Então, precisamos de 2 (primeiro par de dias de fim de semana) + 5 (dias de semana) + 2 (segundo par de dias de fim de semana) + 1 (6º dia de semana) =10 datas a serem consideradas. Um exemplo desse caso extremo seria quando uma data de entrada é domingo.

Precisaremos usar LIMIT 6 para restringir o resultado em até 6 dias apenas, nos casos não marginais.

Esquema (MySQL v5.7)
CREATE TABLE `HELPER_SEQ` (`I` tinyint(3) UNSIGNED NOT NULL);
INSERT INTO `HELPER_SEQ` (`I`) VALUES 
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

Consulta
SELECT
    DATE_FORMAT((DATE('2018-11-21') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')
    AS VAR
FROM `HELPER_SEQ` AS S 
WHERE S.`I` <= 10 
  AND DAYNAME(DATE_FORMAT((DATE('2018-11-21') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')) NOT IN ('SATURDAY', 'SUNDAY')
ORDER BY VAR DESC
LIMIT 6;

Resultado
| VAR        |
| ---------- |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |
| 2018-11-15 |
| 2018-11-14 |

Ver no DB Fiddle

Demonstração do caso Edge - Data de entrada:25 de novembro de 2018 (domingo)
CREATE TABLE `HELPER_SEQ` (`I` tinyint(3) UNSIGNED NOT NULL);
INSERT INTO `HELPER_SEQ` (`I`) VALUES 
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

Consulta nº 2
SELECT
    DATE_FORMAT((DATE('2018-11-25') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')
    AS VAR
FROM `HELPER_SEQ` AS S 
WHERE S.`I` <= 10 
  AND DAYNAME(DATE_FORMAT((DATE('2018-11-25') - INTERVAL(S.`I` - 1) DAY), '%Y-%m-%d')) NOT IN ('SATURDAY', 'SUNDAY')
ORDER BY VAR DESC
LIMIT 6;

Resultado
| VAR        |
| ---------- |
| 2018-11-23 |
| 2018-11-22 |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |

Ver no DB Fiddle