.... 也就是计算开始时间和结束时间之间的年度,
declare @s datetime, @e datetime
select @s='2008-3-31', @e='2008-7-1'select 开始时间=@s,结束时间=@e
,季度数=datepart(qq, @e)-datepart(qq,@s)+1 + datediff(year, @s,@e)*4
如果@s 2008-3-31 的时间小于20 也就是一个季度 也就是90-(1月,2月,3月31的时间 如果小于20 则@s 的时间不算一个季度
declare @s datetime, @e datetime
select @s='2008-3-31', @e='2008-7-1'select 开始时间=@s,结束时间=@e
,季度数=datepart(qq, @e)-datepart(qq,@s)+1 + datediff(year, @s,@e)*4
如果@s 2008-3-31 的时间小于20 也就是一个季度 也就是90-(1月,2月,3月31的时间 如果小于20 则@s 的时间不算一个季度
第四季度里面 如果结果大于20 则这个季度存在这个好像不对吧?
declare @s datetime, @e datetime
select @s='2008-3-31' --开始日期,1季度不足20天
, @e='2008-7-1' --结束日期,3季度不足20天select @s=@s+20 --开始日期向后推20天
, @e=@e-20 --结束日期向前移20天select 开始时间=@s,结束时间=@e
,季度数=datepart(qq, @e)-datepart(qq,@s)+1 + datediff(year, @s,@e)*4
/*
开始时间 结束时间 季度数
----------------------- ----------------------- -----------
2008-04-20 00:00:00.000 2008-06-11 00:00:00.000 1(1 行受影响)
*/
insert tab select 1, '2008-01-20' ,'2008-12-12'
union all select 2, '2008-03-20' ,'2008-10-12'
union all select 3, '2008-10-20' ,'2009-3-12'select *
, [季度数]=datepart(qq, bb-20)-datepart(qq,aa+20)+1 + datediff(year, aa+20,bb-20)*4
from tab
/*
pid aa bb 季度数
----------- ----------------------- ----------------------- -----------
1 2008-01-20 00:00:00.000 2008-12-12 00:00:00.000 4
2 2008-03-20 00:00:00.000 2008-10-12 00:00:00.000 2
3 2008-10-20 00:00:00.000 2009-03-12 00:00:00.000 2(3 行受影响)*/drop table tab
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt)-2,
@dt),
120)+'1')
第一条数据的开始时间>20所以有第一季度 但结束时间=18<20{(90-10月份-11月份-12)=18} 所以不应该有第四季度