я использовал код, чтобы вычислить разницу между двумя даты группы в год, месяцев, дата: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 дней
Как обновить код, чтобы получить желаемый результат?
спасибо, я просто изменить этот Случай, когда сумма (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
Отлично! Надеюсь, она решена на данный момент :) – gofr1