Vi kan bruge DayName()
funktion for at få navnet på ugedagen svarende til en dato. Vi vil bruge denne funktions resultat til at begrænse weekender med NOT IN ('Saturday', 'Sunday')
.
Vi bliver også nødt til at øge nummergeneratorområdet op til 10 . For der er mulighed for, at vi kan støde på 2 weekender (i alt 4 dage) på hver side af 5 hverdage.
Så vi har brug for 2 (første par weekenddage) + 5 (hverdage) + 2 (andet par weekenddage) + 1 (6. hverdag) =10 datoer at overveje. Et eksempel på dette kanttilfælde ville være, når en inputdato er søndag.
Vi bliver nødt til at bruge LIMIT 6
for kun at begrænse resultatet i op til 6 dage i tilfælde uden kant.
Skema (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);
Forespørgsel
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;
Resultat
| VAR |
| ---------- |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |
| 2018-11-15 |
| 2018-11-14 |
Edge Case Demo – Inputdato:25. november 2018 (søndag)
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);
Forespørgsel #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;
Resultat
| VAR |
| ---------- |
| 2018-11-23 |
| 2018-11-22 |
| 2018-11-21 |
| 2018-11-20 |
| 2018-11-19 |
| 2018-11-16 |