Nous pouvons utiliser DayName()
pour obtenir le nom du jour de la semaine correspondant à une Date. Nous utiliserons le résultat de cette fonction pour restreindre les week-ends par NOT IN ('Saturday', 'Sunday')
.
De plus, nous devrons augmenter la plage du générateur de nombres jusqu'à 10 . Parce qu'il est possible que nous rencontrions 2 week-ends (4 jours au total) de part et d'autre de 5 jours de semaine.
Donc, nous avons besoin de 2 (première paire de jours de week-end) + 5 (jours de semaine) + 2 (deuxième paire de jours de week-end) + 1 (6ème jour de semaine) =10 dates à considérer. Un exemple de ce cas limite serait lorsqu'une date d'entrée est le dimanche.
Nous devrons utiliser LIMIT 6
pour restreindre le résultat jusqu'à 6 jours seulement, dans les cas non extrêmes.
Schéma (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);
Requête
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;
Résultat
| VAR |
| ---------- |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |
| 2018-11-15 |
| 2018-11-14 |
Edge Case Demo – Date d'entrée :25 novembre 2018 (dimanche)
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);
Requête 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;
Résultat
| VAR |
| ---------- |
| 2018-11-23 |
| 2018-11-22 |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |