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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--错误版
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值