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