Подсчет дней в интервале дат (периоде) внутри другого заданного интервала дат (периода) - PullRequest
1 голос
/ 09 марта 2012

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

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

В настоящее время мой SQL выглядит так:

SELECT SUM(DATEDIFF(vacation_end_date,vacation_start_date))
FROM vacation WHERE vacation_end_date >= given_start_date 
AND vacation_start_date <= given_end_date'

Я знаю, что DATEDIFF будет работать только в течение дней внутри данного диапазона, но он не должен считать дни вне указанного диапазона.

Пожалуйста, помогите мне, не удалось найти что-то похожее в переполнении стека.

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Если в качестве даты_путешествия_дня это день, когда человек вернулся из отпуска, а не в последний день отпуска, запрос на получение дней отпуска этого человека между 2012-01-01 (включительно) и 2013-01-01 (эксклюзив) будет;

SELECT SUM(
 GREATEST(0, 
  DATEDIFF(
   LEAST('2013-01-01', vacation_end_date),
   GREATEST('2012-01-01', vacation_start_date)
))) 'VACATION_DAYS'
FROM vacation;

Если в качестве последнего дня каникул в отпуске указывается значение holiday_end_date, вам нужно заменить в этом запросе значение holiday_end_date на ADDDATE(vacation_end_date, INTERVAL 1 DAY)), чтобы вычисление было правильным.

Простая демонстрация здесь .

1 голос
/ 09 марта 2012

Если я правильно понял ваш вопрос, использование COUNT должно дать вам то, что вы хотите:

SELECT COUNT(
        DATEDIFF(vacation_end_date,
            if(vacation_start_date < given_start_date, 
                given_start_date,
                vacation_start_date)
        )
    )
FROM vacation WHERE vacation_end_date >= given_start_date 
AND vacation_start_date <= given_end_date'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...