We kunnen gebruik maken van DayName()
functie om de naam van de weekdag te krijgen die overeenkomt met een datum. We zullen het resultaat van deze functie gebruiken om weekenden te beperken tot NOT IN ('Saturday', 'Sunday')
.
We moeten ook het bereik van de nummergenerator vergroten tot 10 . Omdat er een mogelijkheid is dat we 2 weekenden (totaal 4 dagen) aan weerszijden van 5 weekdagen kunnen tegenkomen.
We hebben dus 2 (eerste paar weekenddagen) + 5 (weekdagen) + 2 (tweede paar weekenddagen) + 1 (6e weekdag) =10 data nodig om te overwegen. Een voorbeeld van dit randgeval zou zijn wanneer een invoerdatum zondag is.
We moeten LIMIT 6
. gebruiken om het resultaat te beperken tot slechts 6 dagen, in de gevallen zonder rand.
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);
Zoekopdracht
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;
Resultaat
| VAR |
| ---------- |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |
| 2018-11-15 |
| 2018-11-14 |
Edge Case Demo - Invoerdatum:25 nov 2018 (zondag)
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);
Vraag #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;
Resultaat
| VAR |
| ---------- |
| 2018-11-23 |
| 2018-11-22 |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |