Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rückfall in Daten ohne Wochenenden

Wir können DayName() Funktion, um den Namen des Wochentags zu erhalten, der einem Datum entspricht. Wir werden das Ergebnis dieser Funktion verwenden, um Wochenenden durch NOT IN ('Saturday', 'Sunday') einzuschränken .

Außerdem müssen wir den Bereich des Zahlengenerators auf bis zu 10 erhöhen . Denn es besteht die Möglichkeit, dass wir 2 Wochenenden (insgesamt 4 Tage) auf beiden Seiten von 5 Wochentagen finden.

Wir brauchen also 2 (erstes Paar Wochenendtage) + 5 (Wochentage) + 2 (zweites Paar Wochenendtage) + 1 (6. Wochentag) =10 zu berücksichtigende Daten. Ein Beispiel für diesen Randfall wäre, wenn ein Eingabedatum Sonntag ist.

Wir müssen LIMIT 6 verwenden um das Ergebnis in den Nicht-Edge-Fällen auf nur 6 Tage einzuschränken.

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);

Abfrage

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;

Ergebnis

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

Auf DB Fiddle ansehen

Edge Case Demo – Eingabedatum:25. November 2018 (Sonntag)

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);

Abfrage 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;

Ergebnis

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

Auf DB Fiddle ansehen