SQL-按年、月、日分组的日期-更新
我使用代码按年份、月份、日期计算两个日期组之间的差异:SQL-按年、月、日分组的日期-更新,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我使用代码按年份、月份、日期计算两个日期组之间的差异: ;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(yea
;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)
我得到
('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')
以及何时从该链接执行代码
我明白了:
Item Year NoOfMonth NoOfDays
A1 2013 4 -27
A2 2014 10 58
这不好。。。。2013年应为3个月零4天,
2014年为11个月28天
如何更新代码以获得所需结果?将上次选择更改为:
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)
选择项目,
[年],
如果总和(NoOfDays)<0,则总和(NoOfMonth)-1
当总和(NoOfDays)>30时,则总和(NoOfMonth)+1
ELSE总和(NoOfMonth)结束为NoOfMonth,
如果总和(NoOfDays)>=30,则总和(NoOfDays)-30
当总和(NoOfDays)<0时,则总和(NoOfDays)+30
ELSE总和(NoOfDays)以NoOfDays结束
来自cte
按项目分组[年度]
逐项订购
选项(最大递归0)
这种报告的主要问题是很难定义什么是1个月,DATEDIFF只是从两个日期中取一个数字,然后从另一个日期中减去一个
我选择了30作为月份的天数,现在我将天数的值与30进行比较,以便在天数低于零或低于30时,我们可以将
+1
添加到月份中
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)
选择项目,
[年],
如果总和(NoOfDays)<0,则总和(NoOfMonth)-1
当总和(NoOfDays)>30时,则总和(NoOfMonth)+1
ELSE总和(NoOfMonth)结束为NoOfMonth,
如果总和(NoOfDays)>=30,则总和(NoOfDays)-30
当总和(NoOfDays)<0时,则总和(NoOfDays)+30
ELSE总和(NoOfDays)以NoOfDays结束
来自cte
按项目分组[年度]
逐项订购
选项(最大递归0)
这种报告的主要问题是很难定义什么是1个月,DATEDIFF只是从两个日期中取一个数字,然后从另一个日期中减去一个
我选择了30作为月份的天数计数,现在我将天数的值与30进行比较,这样我们就可以将
+1
添加到月份中,如果天数计数低于零或低于30谢谢,我只是在SUM(NoOfDays)>30时编辑这个案例,然后SUM(NoOfMonth)+1 ELSE SUM(NoOfMonth)结束为NoOfMonth,SUM(NoOfDays)时编辑这个案例<0 THEN SUM(NoOfMonth)-1 ELSE SUM(NoOfMonth)结束为NoOfMonth,当SUM(NoOfDays)>=30 THEN SUM(NoOfDays)-30当SUM(NoOfDays)<0 THEN SUM(NoOfDays)+30 ELSE SUM(NoOfDays)结束为NoOfDays谢谢,我只是在SUM(NoOfDays)>30 THEN SUM(NoOfMonth)时编辑这个案例+1其他总和(NoOfMonth)结束为NoOfMonth,如果总和(NoOfDays)<0,则为NoOfMonth)-1其他总和(NoOfMonth)结束为NoOfMonth,如果总和(NoOfDays)>=30,则为NoOfDays)-30当总和(NoOfDays)<0,则为NoOfDays)+30其他总和(NoOfDays)结束为NoOfDays