2016-10-06 2 views
1

я использовал код, чтобы вычислить разницу между двумя даты группы в год, месяцев, дата:SQL - дата группа по годам, месяцам, дням - обновление

;WITH calendar AS (
SELECT CAST(MIN([From date]) as datetime) as d, 
    MAX([To date]) as e 
FROM ItemTable 
UNION ALL 
SELECT DATEADD(day,1,d), 
    e 
FROM calendar 
WHERE d < e 
), cte AS(
SELECT i.Item, 
    DATEPART(year,c.d) as [Year], 
    DATEDIFF(month,MIN(c.d),MAX(c.d)) as NoOfMonth, 
    DATEDIFF(day,DATEADD(month,DATEDIFF(month,MIN(c.d),MAX(c.d)),MIN(c.d)), 
    MAX(c.d)) as NoOfDays 
FROM ItemTable i 
INNER JOIN calendar c 
ON c.d between i.[From date] and i.[To date] 
GROUP BY i.Item, DATEPART(year,c.d),[From date],[To date] 
) 

SELECT Item, 
    [Year], 
    SUM(NoOfMonth) as NoOfMonth, 
    SUM(NoOfDays) as NoOfDays 
FROM cte 
GROUP BY Item,[Year] 
ORDER BY Item 
OPTION (MAXRECURSION 0) 

Я нашел этот код в SQL - date group by year, month, days

Но не работает для меня ...

Когда я исполню мой запрос

SELECT Item, 
[From date], 
[To date] 
from ItemDate; 

я получил

('A1','2013-08-27','2013-09-27'), 
('A1','2013-09-28','2013-11-28'), 
('A1','2013-11-30','2013-12-03'), 
('A1','2013-12-31','2014-03-31'), 
('A1','2014-04-01','2014-07-01'), 
('A1','2014-07-02','2014-10-02'), 
('A1','2014-10-03','2014-12-31') 

и когда выполнять код из этой ссылки SQL - date group by year, month, days

я получаю это:

Item  Year   NoOfMonth  NoOfDays 
    A1  2013   4    -27 
    A2  2014   10   58 

Это не хорошо .... Это должно быть 3 месяца и 4 дня в течение 2013 года, и за год 2014 11 месяца и 28 дней

Как обновить код, чтобы получить желаемый результат?

ответ

0

Изменение последнего выбора для:

SELECT Item, 
     [Year], 
     CASE WHEN SUM(NoOfDays) < 0 THEN SUM(NoOfMonth)-1 
      WHEN SUM(NoOfDays) > 30 THEN SUM(NoOfMonth)+1 
      ELSE SUM(NoOfMonth) END as NoOfMonth, 
     CASE WHEN SUM(NoOfDays) >= 30 THEN SUM(NoOfDays)-30 
      WHEN SUM(NoOfDays) < 0 THEN SUM(NoOfDays)+30 
      ELSE SUM(NoOfDays) END as NoOfDays 
FROM cte 
GROUP BY Item,[Year] 
ORDER BY Item 
OPTION (MAXRECURSION 0) 

Основная проблема такого отчета - это трудно определить, что 1 месяц, DATEDIFF просто берет число от 2 даты и вычтем одно из другого.

У меня есть выбор 30 как дни подсчитывать в месяц, а теперь я сравниваю значения дней с 30 так что мы можем добавить +1 в месяц, если число день проходит под ноль или ниже 30

+0

спасибо, я просто изменить этот Случай, когда сумма (NoOfDays)> 30 ТОГДА СУММА (NoOfMonth) + 1 ИНАЧЕ СУММА (NoOfMonth) КОНЕЦ, как NoOfMonth, \t \t \t случае, когда сумма (NoOfDays) <0 ТОГДА СУММА (NoOfMonth) - 1 ИНАЧЕ СУММА (NoOfMonth) END как NoOfMonth, CASE КОГДА SUM (NoOfDays)> = 30 THEN SUM (NoOfDays) -30 КОГДА SUM (NoOfDays) < 0 THEN SUM (NoOfDays) +30 ELSE SUM (NoOfDays) END как NoOfDays – dev

+0

Отлично! Надеюсь, она решена на данный момент :) – gofr1

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