Possiamo utilizzare DayName()
funzione per ottenere il nome del giorno della settimana corrispondente a una Data. Utilizzeremo il risultato di questa funzione per limitare i fine settimana di NOT IN ('Saturday', 'Sunday')
.
Inoltre, dovremo aumentare l'intervallo del generatore di numeri fino a 10 . Perché esiste la possibilità che possiamo imbatterci in 2 fine settimana (in totale 4 giorni) su entrambi i lati di 5 giorni feriali.
Quindi, abbiamo bisogno di 2 (prima coppia di giorni del fine settimana) + 5 (giorni feriali) + 2 (seconda coppia di giorni del fine settimana) + 1 (6° giorno della settimana) =10 date da considerare. Un esempio di questo caso limite potrebbe essere quando una data di input è domenica.
Dovremo usare LIMIT 6
per limitare il risultato a soli 6 giorni, nei casi non edge.
Schema (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);
Interroga
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;
Risultato
| VAR |
| ---------- |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |
| 2018-11-15 |
| 2018-11-14 |
Demo di Edge Case - Data di immissione:25 novembre 2018 (domenica)
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);
Richiesta 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;
Risultato
| VAR |
| ---------- |
| 2018-11-23 |
| 2018-11-22 |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |