您的位置:首页 > 数据库

SQL Server数据库 怎样求解给定任意日期的当季首日

2016-07-07 11:30 441 查看
--错误版

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: