Vi kan använda DayName()
funktion för att få namnet på den veckodag som motsvarar ett datum. Vi kommer att använda denna funktions resultat för att begränsa helger med NOT IN ('Saturday', 'Sunday')
.
Vi kommer också att behöva öka nummergeneratorns intervall upp till 10 . För det finns en möjlighet att vi kan stöta på 2 helger (totalt 4 dagar) på vardera sidan av 5 vardagar.
Så vi behöver 2 (första paret helgdagar) + 5 (vardagar) + 2 (andra paret helgdagar) + 1 (6:e veckodagen) =10 datum att ta hänsyn till. Ett exempel på detta kantfall skulle vara när ett inmatningsdatum är söndag.
Vi kommer att behöva använda LIMIT 6
för att begränsa resultatet endast i upp till 6 dagar, i fall utan kant.
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);
Fråga
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 – Inmatningsdatum: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);
Fråga #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 |