Возврат в даты без выходных - PullRequest
0 голосов
/ 21 ноября 2018

Я часто использую это query1, чтобы вернуться на 6 дней назад к переменной дате:

query1 = 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` <= 6;

С помощью этой вспомогательной таблицы с вставленной туда последовательностью.

CREATE TABLE `HELPER_SEQ` (`I` tinyint(3) UNSIGNED NOT NULL);
INSERT INTO `HELPER_SEQ` (`I`) VALUES (1),(2),(3),(4),(5),(6);

Вопрос:

Как можно избежать выходных выходных дней, используя query1?Таким образом, выходная информация возвращается через 6 полезных дней, в этом примере, начиная с «2018-11-21», выходная информация будет ->

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

1 Ответ

0 голосов
/ 21 ноября 2018

Мы можем использовать функцию DayName(), чтобы получить название дня недели, соответствующего дате.Мы будем использовать результат этой функции для ограничения выходных на NOT IN ('Saturday', 'Sunday').

. Кроме того, нам нужно будет увеличить диапазон генератора чисел до 10 .Потому что есть вероятность, что мы можем встретить 2 выходных (всего 4 дня) по обе стороны от 5 рабочих дней.

Итак, нам нужно 2 (первая пара выходных дней) + 5 (рабочие дни) + 2 (вторая пара выходных дней) + 1 (6-й рабочий день) = 10 дат для рассмотрения.Примером этого граничного случая может быть случай ввода даты в воскресенье.

Нам нужно будет использовать LIMIT 6, чтобы ограничить результат только 6 днями, в некраевых случаях.

Схема (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);

Запрос

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;

Результат

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

Просмотр на DB Fiddle


Демонстрация Edge Case - Дата ввода: 25 ноября 2018 (воскресенье)

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

Запрос № 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;

Результат

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

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...