sql >> Base de Datos >  >> RDS >> Mysql

Throwback en fechas sin fines de semana

Podemos utilizar DayName() para obtener el nombre del día de la semana correspondiente a una Fecha. Utilizaremos el resultado de esta función para restringir los fines de semana por NOT IN ('Saturday', 'Sunday') .

Además, tendremos que aumentar el rango del generador de números hasta 10 . Porque existe la posibilidad de que podamos encontrarnos con 2 fines de semana (4 días en total) en cualquier lado de 5 días de la semana.

Entonces, necesitamos 2 (primer par de días de fin de semana) + 5 (días de semana) + 2 (segundo par de días de fin de semana) + 1 (sexto día de semana) =10 fechas a considerar. Un ejemplo de este caso límite sería cuando una fecha de entrada es el domingo.

Tendremos que usar LIMIT 6 para restringir el resultado hasta 6 días solamente, en los casos no extremos.

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 en DB Fiddle

Edge Case Demo - Fecha de entrada:25 de noviembre 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 #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 en DB Fiddle