Member 10696161 Ответов: 2

Как выбрать диапазон между использоваться следующие переменные и end_date - в MySQL


В этом случае у меня есть таблица "оставить" :

+--------+---------+---------+-------------+---------+-----------+
|ID_LEAVE|ID_WORKER| BEGIN_DATE          | END_DATE              |
+--------+---------+---------+---------+------------+------------+
| 4      |   26    |2019-03-19 07:00:00  |2019-03-22 15:00:00    |  
+--------+---------+---------+----------------------+------------+


Я хочу написать запрос mysql, который выбирает все в диапазоне между датой начала и датой окончания, а затем подводит итог. Когда я так пишу:

SELECT *, 
time_format(SUM((datediff(END_DATE, BEGIN_DATE) + 1) * (time(END_DATE) - time(BEGIN_DATE))), '%H:%i:%s') AS 'LEAVE TIME' 
FROM leave 
WHERE (DATE(BEGIN_DATE) >= '2019-03-19' AND DATE(END_DATE) <='2019-03-22') 
GROUP BY ID_LEAVE;


Затем показывается вот так:

+--------+---------+---------+-------------+---------+------------------------+
|ID_LEAVE|ID_WORKER| BEGIN_DATE          | END_DATE              | LEAVE_TIME |
+--------+---------+---------+---------+------------+--------------------+-----
| 4      |   26    |2019-03-19 07:00:00  |2019-03-22 15:00:00    |  32:00:00  |
+--------+---------+---------+----------------------+------------+-------------


SELECT *, 
time_format(SUM((datediff(END_DATE, BEGIN_DATE) + 1) * (time(END_DATE) - time(BEGIN_DATE))), '%H:%i:%s') AS 'LEAVE TIME' 
FROM leave 
WHERE (DATE(BEGIN_DATE) >= '2019-03-19' AND DATE(END_DATE) <='2019-03-21') 
GROUP BY ID_LEAVE;


Это ничего не показывает.

У меня есть вопрос: можно ли показать все в диапазоне (Begin_date и End_date)? Если да, то может ли кто-нибудь объяснить, как это написать? Спасибо за любой ответ.

Что я уже пробовал:

Я пробовал писать вот так:

SELECT *, 
time_format(SUM((datediff(END_DATE, BEGIN_DATE) + 1) * (time(END_DATE) - time(BEGIN_DATE))), '%H:%i:%s') AS 'LEAVE TIME' 
FROM leave 
WHERE (DATE(BEGIN_DATE) >= '2019-03-19' AND DATE(END_DATE) <='2019-03-21') 
GROUP BY ID_LEAVE;


Но это не помогло.

2 Ответов

Рейтинг:
1

Maciej Los

В соответствии с решением Ричарда я бы посоветовал прочитать эту превосходную статью, которая может помочь вам понять отношения временных периодов: Библиотека временных периодов для .NET[^]

Кажется, вы хотите получить данные, которые начинаются или заканчивается в течение желаемого периода времени... Вы должны внести соответствующие изменения в свою жизнь. WHERE заявление:

WHERE (DATE(BEGIN_DATE) >= '2019-03-19' AND DATE(END_DATE) <='2019-03-21')
    OR (DATE(BEGIN_DATE) >= '2019-03-19' OR DATE(END_DATE) <='2019-03-21')


Первая часть where оператор получает данные, которые дата начала и дата окончания находятся между желаемым периодом времени (закрытый период времени), второй получает данные, которые могут перекрывать/превышать желаемый период времени.

Понял?


Maciej Los

Превосходно! Спасибо за это.
Овации
Мацей

Рейтинг:
0

Richard MacCutchan

WHERE (DATE(BEGIN_DATE) >= '2019-03-19' AND DATE(END_DATE) <='2019-03-21')

Вы пытаетесь выбрать записи, конечная дата которых меньше или равна 21, но конечная дата вашей записи равна 22.


Member 10696161

Но как насчет решения проблемы? У тебя это есть?

Richard MacCutchan

Решение очевидно: 22 никогда не может быть меньше 21.

Maciej Los

5ed!
Ястребиный глаз!

Richard MacCutchan

лол