--错误版
declare @TrailingDate Date;
set @TrailingDate='20161207';
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-3) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改正版
--原版SQL中convert(varchar(2), month(@TrailingDate)-3)中会导致逢6,9,12月份的季度首日提前至3,6,9月,正解为4,7,10月
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-2) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改进版
select convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), 3*((month(@TrailingDate)-1)/3)+1) + '-01') as CurrentQuarter
-- 3*((month(@TrailingDate)-1)/3)+1)在数学计算上等于month(@TrailingDate),但它们真的相等吗?
--最优解版
select DATEADD(qq,DATEDIFF(qq,0,@TrailingDate), 0) as CurrentQuarter
declare @TrailingDate Date;
set @TrailingDate='20161207';
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-3) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改正版
--原版SQL中convert(varchar(2), month(@TrailingDate)-3)中会导致逢6,9,12月份的季度首日提前至3,6,9月,正解为4,7,10月
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-2) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改进版
select convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), 3*((month(@TrailingDate)-1)/3)+1) + '-01') as CurrentQuarter
-- 3*((month(@TrailingDate)-1)/3)+1)在数学计算上等于month(@TrailingDate),但它们真的相等吗?
--最优解版
select DATEADD(qq,DATEDIFF(qq,0,@TrailingDate), 0) as CurrentQuarter