Sql 按dateadd和datediff对日期进行分组

Sql 按dateadd和datediff对日期进行分组,sql,sql-server,group-by,datediff,dateadd,Sql,Sql Server,Group By,Datediff,Dateadd,我试着将一组日期按时段分组,即“月” 首先,我声明该表: --inserts 36 dates every 10 days create table sales (sales_date datetime, sales_amount decimal(12,2)) insert into sales (sales_date,sales_amount) select '20140101',1000 union all select '20140110',1000 union all select '2

我试着将一组日期按时段分组,即“月”

首先,我声明该表:

--inserts 36 dates every 10 days
create table sales (sales_date datetime, sales_amount decimal(12,2))
insert into sales (sales_date,sales_amount)
select '20140101',1000 union all
select '20140110',1000 union all
select '20140120',1000 union all
select '20140130',1000 union all
...
然后我查询按时段分组的条目(大小=精度*月份)

结果:

Test 1 : precision of 1 month
From : 01/01/2014, To : 01/02/2014, number : 4
From : 01/02/2014, To : 01/03/2014, number : 2
From : 01/03/2014, To : 01/04/2014, number : 3
From : 01/05/2014, To : 01/06/2014, number : 4
From : 01/06/2014, To : 01/07/2014, number : 3
From : 01/07/2014, To : 01/08/2014, number : 3
From : 01/08/2014, To : 01/09/2014, number : 3
From : 01/09/2014, To : 01/10/2014, number : 3
From : 01/10/2014, To : 01/11/2014, number : 3
From : 01/11/2014, To : 01/12/2014, number : 3
From : 01/12/2014, To : 01/01/2015, number : 2

Test 2 : precision of 2 months
From : 01/01/2014, To : 01/03/2014, number : 6
From : 01/03/2014, To : 01/05/2014, number : 6
From : 01/05/2014, To : 01/07/2014, number : 7
From : 01/07/2014, To : 01/09/2014, number : 6
From : 01/09/2014, To : 01/11/2014, number : 6
From : 01/11/2014, To : 01/01/2015, number : 5

Test 3 : precision of 3 months
From : 01/01/2014, To : 01/04/2014, number : 9
From : 01/04/2014, To : 01/07/2014, number : 10
From : 01/07/2014, To : 01/10/2014, number : 9
From : 01/10/2014, To : 01/01/2015, number : 8

Test 4 : precision of 4 months
From : 01/01/2014, To : 01/05/2014, number : 12
From : 01/05/2014, To : 01/09/2014, number : 13
From : 01/09/2014, To : 01/01/2015, number : 11
在测试5之前,一切正常:

Test 5 : precision of 5 months
From : 01/10/2013, To : 01/03/2014, number : 6
From : 01/03/2014, To : 01/08/2014, number : 16
From : 01/08/2014, To : 01/01/2015, number : 14
第一行很烦人,我需要它从2014年1月1日开始,就像之前的精度一样


有什么办法可以解决这个问题吗?

对于
FROM
列,您不需要除以精度,然后再乘以精度

下面是正在发生的事情

datediff(month, 0, sales_date)/5  -> 273.6   as it is integer division, it is converting to 273
将其进一步乘以
273*5=1365
(因此整数除法会损失3个月)

所以这个应该适合你

DECLARE @precision int = 5 --number of months

SELECT 
dateadd(month, (datediff(month, 0, sales_date) ) , 0) as [From],
dateadd(month, @precision + (datediff(month, 0, sales_date) ) , 0) as [To], 
count(*) as number
FROM sales
GROUP BY 
dateadd(month, (datediff(month, 0, sales_date) ) , 0),
dateadd(month, @precision + (datediff(month, 0, sales_date) ), 0)

我不知道你是如何得到你得到的输出的,也就是说,我希望看到
'FROM:“
作为你的选择列列表的开始,但我不知道,因此我相信你没有在这里向我们展示一个中间步骤,这可能就是你的“翻译”的地方发生错误。
并且销售日期不为空。
。。。该行不需要
结果只来自于我的C#单元测试,但sql server给出了完全相同的结果;Inserts和query compile ANYWAY显示测试5的查询结果。检查此项是否需要
/@precision)*@precision
;没有它,每个周期只有一个周期month@codablank1,然后使用精度为5。0@codablank1,而且我在第二节仍然有精度,所以你会得到所有的分数
DECLARE @precision int = 5 --number of months

SELECT 
dateadd(month, (datediff(month, 0, sales_date) ) , 0) as [From],
dateadd(month, @precision + (datediff(month, 0, sales_date) ) , 0) as [To], 
count(*) as number
FROM sales
GROUP BY 
dateadd(month, (datediff(month, 0, sales_date) ) , 0),
dateadd(month, @precision + (datediff(month, 0, sales_date) ), 0)