--错误版
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
本文介绍了一种使用SQL来确定指定日期所在季度起始日期的方法。通过对比错误版本和改进后的SQL脚本,展示了如何准确地获取当前季度的第一天。文中提供了多种实现方式,包括最优解版,帮助读者理解和应用。

被折叠的 条评论
为什么被折叠?



