2015-05-05 5 views
-3
года

Сейчас я работаю на запрос, чтобы вычислить общее количество дней между диапазонами дат в годуОбщего количества дней между двумя датами по

Таблица:

Start Date End Date 
01/01/2013 04/30/2014 
11/01/2014 05/31/2015 
06/01/2015 12/31/2015 

Моего ожидаемого результат.

2013 - 365 
2014 - 180 
2015 - 365 

Я могу сделать это несколькими шагами, используя временную таблицу. Есть ли простой способ сделать этот расчет.

Благодаря

+0

не ясно, о чем вы спрашиваете, как делает первый «строка» знать, чтобы игнорировать даты в 2014 году, а второй один знаю, игнорировать даты в 2015 году - это это конец года даты начала или окончания даты в зависимости от того, что меньше? – Hogan

+1

Почему 2015 - 365? В ваших образцовых данных нет 01/01/2015. –

+0

@TabAlleman - да ожидаемые результаты не имеют смысла во многих отношениях. – Hogan

ответ

-1
PRINT DATEDIFF(DAY, '1/1/2013', '4/30/2014') 

Это даст вам то, что вы ищете. Просто повторите все даты, которые вы хотите.

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

+0

Очевидно, что это не сработало с 'DATEDIFF (DAY, '1/1/2013', '4/30/2014') 'не 365, что и сказал OP, ожидаемый результат. – Hogan

0

Хорошо так попробовать это:

SELECT * INTO #yourTable 
FROM 
(
    SELECT CAST('01/01/2013' AS DATE),CAST('04/30/2014' AS DATE) UNION ALL 
    SELECT '11/01/2014','05/31/2015' UNION ALL 
    SELECT '06/01/2015','12/31/2015' 
) A(StartDate,EndDate); 

DECLARE @MaxEndDate DATE = (SELECT MAX(EndDate) FROM #yourTable); 

WITH CTE_Dates 
AS 
(
    SELECT MIN(StartDate) dates 
    FROM #yourTable 

    UNION ALL 

    SELECT DATEADD(Day,1,dates) 
    FROM CTE_Dates 
    WHERE dates < @MaxEndDate 
) 

SELECT YEAR(dates) yr,COUNT(DATES) cnt 
FROM #yourTable A 
CROSS APPLY(SELECT dates FROM CTE_Dates WHERE dates BETWEEN A.startDate AND A.EndDate) CA 
GROUP BY YEAR(dates) 
OPTION (MAXRECURSION 0) 
+0

Спасибо за ваш ответ. Весь 2015 год охвачен диапазоном. Поэтому я ожидал бы 365 дней на 2015 год. – itsfighter

+0

Я редактировал свой код. На этот раз я получил, по крайней мере, очень близко. – Stephan

Смежные вопросы