Mysql
 sql >> Database >  >> RDS >> Mysql

Ritorno al passato in date senza fine settimana

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 |

Visualizza su DB Fiddle

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 |

Visualizza su DB Fiddle