Как суммировать отпуск без выходных

В этом случае в базе данных mysql я вставил новый отпуск в таблицу «выход»:

+--------+---------+---------+-------------+----------+--------------------------
|ID_LEAVE|ID_WORKER| FNAME   | LNAME | BEGIN_DATE         | END_DATE            | 
+--------+---------+---------+---------+-------------+--------------------+------
| 5      |   10    | MARIO   | NEED  |2019-03-22 07:00:00 |2019-03-25 15:00:00  | 
+--------+---------+---------+-------------+----------+-------------------------- 

Когда я суммирую время отпуска в запросе mysql ниже:

SELECT leave.ID_LEAVE, 
leave.ID_WORKER, 
leave.BEGIN_DATE, 
leave.END_DATE, 
time_format(SUM((datediff(leave.END_DATE, leave.BEGIN_DATE) + 1) * (time(leave.END_DATE) - time(leave.BEGIN_DATE))), '%H:%i:%s') AS 'LEAVE TIME'
FROM leave 
GROUP BY leave.ID_LEAVE

у меня есть ВРЕМЯ ВЫХОДА = 32:00:00

Но я вижу, что выходные дни (субботы и воскресенья) тоже считаются. Я понятия не имею, как что я должен изменить, если можно считать без выходных. В этом случае Время выхода должно быть 16:00:00. Может кто-нибудь пожалуйста, какой запрос я могу изменить. Спасибо за любой совет. :)

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
122
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это довольно сложно для @Prochu1991, но я думаю, что мне удалось составить для вас запрос.

Обновлено: В приведенном ниже запросе есть несколько проблем в некоторых условиях. Поэтому я не рекомендую его использовать, но я оставлю его здесь на случай, если вы сможете что-то с этим сделать:

-- Query 6: Final calculation add SUM of total leave time GROUP BY ID_LEAVE,ID_WORKER.
SELECT ID_LEAVE,ID_WORKER,BEGIN_DATE,END_DATE,
SEC_TO_TIME(SUM(TIME_TO_SEC(leave_TIME))) AS 'LEAVE TIME' 
FROM (
Query 5: Calculating leave time on each date only if VALID_LEAVE_DATES=1.
SELECT ID_LEAVE,ID_WORKER,BEGIN_DATE,END_DATE,
 IF(VALID_LEAVE_DATES=1,SEC_TO_TIME(TIME_TO_SEC(TIME(end_date))-TIME_TO_SEC(TIME(begin_date))),0) AS 'LEAVE_TIME' 
FROM (
-- Query 4: Add checking' if any of the dates are in the weekend, it will be set as 0.
SELECT leave_dates,
IF(DAYNAME(LEAVE_DATES) IN ('Saturday','Sunday'),0,1) AS 'VALID_LEAVE_DATES',
ID_LEAVE,ID_WORKER,BEGIN_DATE,END_DATE FROM (
-- Query 3: In this part, the main reason is to create dates between BEGIN_DATE and END_DATE.
SELECT ID_LEAVE,ID_WORKER,BEGIN_DATE,END_DATE,
-- concatenating extracted year-month with days generated from Query 1.
CONCAT_WS('-',DATE_FORMAT(BEGIN_DATE, '%Y-%m'),LPAD(days,2,0)) AS 'LEAVE_DATES' FROM
-- Query 1: This part is creating day value directly from query. If you run this individually, you'll get a day value from 0 to 39.
(SELECT 1 AS 'id'
a+b AS 'days' FROM
(SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7
UNION SELECT 8 UNION SELECT 9) a,
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 UNION SELECT 30) dd
-- Query 1 end here.
) ee 
LEFT JOIN 
-- Query 2: This is your original query. I removed the SUM in select.
(SELECT 1 AS 'id',
leave.ID_LEAVE, 
leave.ID_WORKER, 
leave.BEGIN_DATE, 
leave.END_DATE
FROM leave GROUP BY leave.ID_LEAVE) cd 
-- Query 2 end here.
ON ee.id=cd.id 
WHERE days BETWEEN DAY(BEGIN_DATE) AND DAY(END_DATE) -- `WHERE` condition only take date value between BEGIN_DATE and END_DATE from Query 2.
ORDER BY LEAVE_DATES) LCALC -- Query 3 end here.
) vvv GROUP BY ID_LEAVE,LEAVE_DATES -- Query 4 end here.
) tuv -- Query 5 end here.
GROUP BY ID_LEAVE,ID_WORKER; -- Query 6 end here.

Надеюсь, вы понимаете мое объяснение. Я все еще буду работать с этим запросом и посмотрю, есть ли способ сократить некоторые процессы (меньше запросов).

Обновлено еще раз: Хорошо, я делал это @Prochu1991:

SELECT *,IF(valid_leave_days=0, TIMEDIFF(end_date,begin_date),
-- Assuming that normal working hours is '08:00:00'. If more, you just need to change here.
SEC_TO_TIME(TIME_TO_SEC('08:00:00')*Valid_leave_days)) AS 'Total_leave_time' 
-- So I convert 8 hours to seconds multiply with valid_leave_days calculated and convert it back to time. I think you understand this part.
FROM
(SELECT *,
-- This part where the CASE start is actually just determining how many leave days per person. 
-- Then minus with the total of weekend per week (sat & sun = 2 days).
CASE 
WHEN datedif<6 THEN datedif --if leave days are less than 6 days, it return datedif.
WHEN datedif=6 THEN datedif-1 --if leave days=6, datedif-1 day > because in any day you start you will surely get one weekend.
WHEN datedif BETWEEN 7 AND 12 THEN datedif-2 --if leave days between 7 and 12, datedif-2.
WHEN datedif=13 THEN datedif-3 -- from here you should get the idea.
WHEN datedif BETWEEN 14 AND 19 THEN datedif-4
WHEN datedif=20 THEN datedif-5
WHEN datedif BETWEEN 21 AND 26 THEN datedif-6
WHEN datedif=27 THEN datedif-7
WHEN datedif BETWEEN 28 AND 34 THEN datedif-8 
-- Note that this is only up to 34 days. if you want to add more days, just make sure the calculation is correct.
END AS 'Valid_leave_days' 
FROM
(SELECT *,DATEDIFF(end_date,begin_date) AS 'datedif' FROM LEAVE) a) b;

у меня вопрос, а leave_dates создается не из таблицы?

Prochu1991 10.04.2019 07:30

Нет, но это диапазон между begin_date и end_date в вашей таблице выходных. Я сам работал над некоторыми отчетами и обнаружил, что у меня есть диапазон дат, но не все даты между диапазоном дат; который необходим для моей цели отчета. Работая над вашим условием, мне сложно использовать диапазон дат, потому что я могу получить неправильный результат. Поэтому я подумал, что если у меня будет общее время каждой даты с условием исключить выходные и суммировать их, то я получу результат.

FanoFN 10.04.2019 08:03

хорошо, я протестировал этот код и работает очень правильно. Большое спасибо, приятель! :)

Prochu1991 10.04.2019 08:11

Пока @Prochu1991 . Я все еще работаю над тем, как сделать более короткий и, надеюсь, более эффективный запрос. Я сообщу вам, если мне удастся сделать один. И вместо того, чтобы использовать DATEDIFF в других ваших запросах, вы можете попробовать использовать TIMEDIFF. Посмотрим, поможет ли это тебе.

FanoFN 10.04.2019 08:18

В базе данных mysql все еще работает нормально, но когда я добавляю этот код в .net, он вычисляет его с выходными (чего не должно быть). Может быть, я найду какое-нибудь решение, подобное этому.

Prochu1991 10.04.2019 08:35

Правильно @Prochu1991. Моя область знаний ограничена только использованием запросов MySQL, поскольку моя работа обычно заключается в извлечении данных непосредственно из базы данных. Итак, проблема в том, что я не знаю, как реализовать запрос в программе, потому что я не уверен, какая функция работает, а какая нет. Как вы сказали, в среде MySQL этот запрос может вернуть желаемый результат. Извините, но я ограничиваюсь только этим. Надеюсь, вы найдете способ решить эту проблему. Я проголосую за вас и посмотрю, сможет ли этот вопрос привлечь больше внимания.

FanoFN 10.04.2019 08:50

у меня еще один вопрос что это значит LCALC

Prochu1991 10.04.2019 10:42

это ничего @Prochu1991. Это просто псевдоним для подзапроса. Вы можете изменить его на все, что вы понимаете. Я сделал эту аббревиатуру от «ОСТАВИТЬ РАСЧЕТ» > поэтому она стала LCALC.

FanoFN 10.04.2019 10:45

ааа, хорошо @tcadidot0, что касается вашего кода, я имел дело с кодом .net. ;) Теперь меня интересует код, который я отправляю в качестве ответа.

Prochu1991 10.04.2019 11:00

Привет @tcadidot0, я проверил этот случай: у работника есть leave_time 2019-03-23 - 2019-04-01. Вместо того, чтобы вычислить, сколько времени... запрос ушел - ничего не показывает. Вы обновили свой запрос?

Prochu1991 11.04.2019 08:39

Нет, я ничего не редактировал. Вероятно, это из-за диапазона дат. Приведенный выше запрос работает, потому что ваш предыдущий диапазон дат находится в том же месяце, а 2019-03-23 - 2019-04-01 — между двумя разными месяцами. Должен сказать, я это предвидел. Может пора попробовать TIMEDIFF?

FanoFN 11.04.2019 09:04

я изменил на TIMEDIFF из строки SEC_TO_TIME(TIME_TO_SEC(TIME(end_date))-TIME_TO_SEC(TIME(beg‌​in_date))). Но не особо помогло.

Prochu1991 11.04.2019 09:22

Привет @tcadidot0, что касается вашего второго отредактированного кода, то он тоже считается в следующем месяце, но он по-прежнему также рассчитывает выходные. потому что когда 2019-03-22 07:00:00 2019-03-31 15:00:00 есть 56:00:00, должно быть 48:00:00. В случае 2019-03-22 07:00:00 2019-03-31 15:00:00` вместо 64:00:00 должно быть слишком 48:00:00

Prochu1991 11.04.2019 20:24

Но я не знаю почему: в случае считается, что в случае 2019-03-20 07:00:00 - 2019-03-21 15:00:00 считается 08:00:00 вместо 16:00:00

Prochu1991 11.04.2019 20:36

@ Prochu1991 .. Я думал об этом с тех пор, как обновил код .. Это не работает .. вздох .. это сложнее, чем я думал

FanoFN 12.04.2019 01:57

Извините, я отправил другой ответ. Вы можете попробовать это? Это модификация второго запроса выше с проверкой begin_date:

SELECT *,TIMEDIFF(end_date,begin_date),IF(valid_leave_days2=0, TIMEDIFF(end_date,begin_date),SEC_TO_TIME(TIME_TO_SEC('08:00:00')*Valid_leave_days2)) AS 'Total_leave_time' FROM
(SELECT *,DAYNAME(begin_date),
CASE
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF=6 THEN datedif-1 
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF > 6 AND datedif < 13 THEN datedif-2 
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF=13 THEN datedif-3 
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF > 13 AND datedif < 20 THEN datedif-4 
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF=20 THEN datedif-5 
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF > 20 AND datedif < 27 THEN datedif-6
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF=27 THEN datedif-7 
WHEN DAYNAME(begin_date)='Monday' AND DATEDIF > 27 AND datedif < 34 THEN datedif-8 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF=5 THEN datedif-1 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF > 5 AND datedif < 12 THEN datedif-2 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF=12 THEN datedif-3 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF > 12 AND datedif < 19 THEN datedif-4 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF=19 THEN datedif-5 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF > 19 AND datedif < 26 THEN datedif-6
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF=26 THEN datedif-7 
WHEN DAYNAME(begin_date)='Tuesday' AND DATEDIF > 26 AND datedif < 33 THEN datedif-8 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF=4 THEN datedif-1 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF > 4 AND datedif < 11 THEN datedif-2 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF=11 THEN datedif-3 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF > 11 AND datedif < 18 THEN datedif-4 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF=18 THEN datedif-5 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF > 18 AND datedif < 25 THEN datedif-6
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF=25 THEN datedif-7 
WHEN DAYNAME(begin_date)='Wednesday' AND DATEDIF > 25 AND datedif < 32 THEN datedif-8 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF=3 THEN datedif-1 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF > 3 AND datedif < 10 THEN datedif-2 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF=10 THEN datedif-3 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF > 10 AND datedif < 17 THEN datedif-4 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF=17 THEN datedif-5 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF > 17 AND datedif < 24 THEN datedif-6
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF=24 THEN datedif-7 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF > 24 AND datedif < 31 THEN datedif-8 
WHEN DAYNAME(begin_date)='Thursday' AND DATEDIF=31 THEN datedif-9 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF=3 THEN datedif-1 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF > 3 AND datedif < 9 THEN datedif-2 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF=9 THEN datedif-3 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF > 9 AND datedif < 16 THEN datedif-4 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF=16 THEN datedif-5 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF > 16 AND datedif < 23 THEN datedif-6
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF=23 THEN datedif-7 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF > 23 AND datedif < 30 THEN datedif-8 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF=30 THEN datedif-9 
WHEN DAYNAME(begin_date)='Friday' AND DATEDIF > 30 AND datedif < 37 THEN datedif-10 
ELSE datedif END AS 'valid_leave_days2' FROM
(SELECT *,DATEDIFF(end_date,begin_date-INTERVAL 1 DAY) AS 'datedif' FROM LEAVE) a) b;

За ваш комментарий «Но я не знаю, почему: в случае считается, что в случае 2019-03-20 07:00:00 - 2019-03-21 15:00:00 считается 08:00:00 вместо 16:00 :00", я понял, что DATEDIFF не включает BEGIN_DATE или END_DATE в расчет. Допустим, в вашем случае, если вы это сделаете DATEDIFF(END_DATE,BEGIN_DATE), это будет считаться так, END_DATE-BEGIN_DATE поэтому 21/03-20/03 будет только 1 день! О боже, я тоже только сейчас в этом разбираюсь. Я проверил, есть ли в MySQL такая функция, как DATE_COUNT, но ее нет. Поэтому я немного изменил нижний запрос, добавив DATEDIFF(end_date,begin_date-INTERVAL 1 DAY) AS 'datedif'. Таким образом, - INTERVAL 1 DAY заставляет функцию начинать отсчет дней с BEGIN_DATE.

P/S: Можно и так DATEDIFF(end_date + INTERVAL 1 DAY,begin_date) AS 'datedif'.

Обновлено: Это результат, который я получаю с моими тестовыми данными, выполнив приведенный выше запрос.

+------------+-------------+-----------------------+-----------------------+-----------+-----------------------+---------------------+---------------------------------+--------------------+
| "ID_LEAVE" | "ID_WORKER" |     "BEGIN_DATE"      |      "END_DATE"       | "datedif" | "DAYNAME(begin_date)" | "valid_leave_days2" | "TIMEDIFF(end_date,begin_date)" | "Total_leave_time" |
+------------+-------------+-----------------------+-----------------------+-----------+-----------------------+---------------------+---------------------------------+--------------------+
| "3"        | "26"        | "2019-03-20 07:00:00" | "2019-04-01 15:00:00" | "13"      | "Wednesday"           | "9"                 | "296:00:00"                     | "72:00:00"         |
| "4"        | "22"        | "2019-03-20 07:00:00" | "2019-03-20 15:00:00" | "1"       | "Wednesday"           | "1"                 | "08:00:00"                      | "08:00:00"         |
| "5"        | "27"        | "2019-03-01 07:00:00" | "2019-03-31 15:00:00" | "31"      | "Friday"              | "21"                | "728:00:00"                     | "168:00:00"        |
| "6"        | "28"        | "2019-03-22 07:00:00" | "2019-03-31 15:00:00" | "10"      | "Friday"              | "6"                 | "224:00:00"                     | "48:00:00"         |
| "7"        | "29"        | "2019-03-20 07:00:00" | "2019-03-21 15:00:00" | "2"       | "Wednesday"           | "2"                 | "32:00:00"                      | "16:00:00"         |
| "8"        | "30"        | "2019-03-20 07:00:00" | "2019-03-22 15:00:00" | "3"       | "Wednesday"           | "3"                 | "56:00:00"                      | "24:00:00"         |
| "9"        | "31"        | "2019-03-28 07:00:00" | "2019-04-01 15:00:00" | "5"       | "Thursday"            | "3"                 | "104:00:00"                     | "24:00:00"         |
+------------+-------------+-----------------------+-----------------------+-----------+-----------------------+---------------------+---------------------------------+--------------------+

Я ценю ваш ответ и помощь. :) Но я только что проверил этот код, и в этом случае, когда я запускал для случая 28-03-2019 7:00:00 до 01-04-2019 15:00:00, общее время должно быть 24:00:00, а не 264:00:00. Но я вижу, что ты почти у цели. Что умирает только последняя надежда. ;)

Prochu1991 12.04.2019 07:34

что касается строки кода SELECT *,DATEDIFF(end_date,begin_date-INTERVAL 1 DAY) AS 'datedif' FROM LEAVE это оригинальный запрос (как первый)?

Prochu1991 12.04.2019 07:58

SELECT *,DATEDIFF(end_date,begin_date-INTERVAL 1 DAY) AS 'datedif' FROM LEAVE Я добавил -INTERVAL 1 DAY, чтобы считать BEGIN_DATE за 1 день. Что касается 28-03-2019 7:00:00 to 01-04-2019 15:00:00, возвращающего 264:00:00, я не уверен, потому что я тестировал здесь с тем же диапазоном дат, но он возвращает 24:00:00. Пожалуйста, смотрите обновленный ответ.

FanoFN 12.04.2019 08:07

Я обновил результат запроса. Я ничего не изменил из запроса. :)

FanoFN 12.04.2019 08:11

Не могли бы вы предоставить базу данных mysql, которую вы тестировали?

Prochu1991 12.04.2019 08:18

Какая у вас версия mysql? У меня 10.1.37-МарияДБ

Prochu1991 12.04.2019 08:28

В настоящее время у меня есть MySQL 4.1, MySQL 5.5 и MariaDB 10.3. И я тестировал это на MySQL 4.1 и MariaDB 10.3.

FanoFN 12.04.2019 08:32

Вы тестировали на MariaDB 10.1.37?

Prochu1991 12.04.2019 08:41

Только что проверил на 64-битной версии MariaDB 10.1.37 и получил тот же результат. :)

FanoFN 12.04.2019 08:47

Боюсь, у меня нет XAMPP @Prochu1991. Я предлагаю вам попробовать решение Себастьяна. Я проверил этот запрос, и он намного лучше, чем то, что я сделал

FanoFN 12.04.2019 09:06

Но с другой стороны, вы начали новую карьеру в SQL почти так же, как и я! :)

Prochu1991 12.04.2019 09:17

ха-ха, это правда @Prochu1991, это хорошее учебное упражнение, и я рад, что в конце концов кто-то придумал очень хороший ответ.

FanoFN 12.04.2019 09:19
Ответ принят как подходящий

Вы можете использовать следующее решение, используя таблицу календаря (на основе этого решения):

SELECT ID_LEAVE, SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(TIME(end_date), TIME(begin_date)))))
FROM (
    SELECT ADDDATE('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) AS date_value
    FROM
        (SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
        (SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
        (SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
        (SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
        (SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
) calendar INNER JOIN `leave` ON calendar.date_value BETWEEN DATE(leave.BEGIN_DATE) AND DATE(leave.END_DATE)
WHERE NOT WEEKDAY(date_value) IN (5, 6)
GROUP BY ID_LEAVE

демо на db-fiddle.com

Это то, что я пытался сделать. В итоге я только создаю таблицу calendar, но понятия не имею, как к ним присоединиться и получить правильный результат. :'(

FanoFN 12.04.2019 09:09

AS, что касается второго (отредактированного) кода, который я протестировал и изменил значения «оставить», и что-то пошло не так: dbfiddle.uk/…

Prochu1991 14.04.2019 18:25

@ Prochu1991 - Похоже, в некоторых конкретных случаях возникают проблемы. спасибо за эту информацию. Я снова удаляю математический запрос. Решение для таблицы календаря работает. Это была попытка.

Sebastian Brosch 14.04.2019 22:10

Другие вопросы по теме