如何解决SQL 日期逻辑 - 查找先前的 *非标准* 季度
sql Server 2012。
我们有一个使用非标准季度报告的业务部门。每个季度从 11 月开始,到 10 月结束。为了解决这个问题,Q1:11 月到 1 月; Q2:二月至四月; Q3:5-7月; Q4:8-10 月
我正在尝试创建一个“简单而高效”的查询,该查询可以根据此非标准方案获取给定日期并返回上一个“季度”的第一个和最后一个日期。
一位前同事使用了一个相当笨拙的复杂案例表达式来处理这个问题,我想找到一个更好的方法。
我知道 sql Server 有一些处理季度的内置日期逻辑,但仅限于标准日历季度。因此,以下内容将可靠地返回上一季度的第一天,但只是从 1 月开始到 12 月结束的季度标准方案......
SELECT DATEADD(quarter,DATEDIFF(quarter,GETDATE()) - 1,0)
--Shows first day of prior quarter,but only for 'standard' quarters
然后我天真地认为只要减去两个月就可以了,但有 2/3 的时候这是错误的
SELECT DATEADD(month,-2,DATEADD(quarter,0))
--Works for 1/3 dates
从那以后,我尝试了各种嵌套计算方案,但没有任何可行的方法。
谁能帮我计算一下 - 或者你会建议我只创建一个日期表,让我查找非标准季度?谢谢
解决方法
您可以使用以下查询:-
namespace MyApp.Controllers
{
public class Controller: Controller
{
public IActionResult Index(int compPeriod)
{
// load entity for selected key
TREEGRID entity = null;
using (var context = new MyDbContext())
{
entity = context.TREEGRID.Include(per => per.GridPanel).FirstOrDefault(per => per.DataPeriodKey == compPeriod);
}
return View("Index",entity);
}
}
}
,
您可以根据需要使用以下查询来确定上一季度的第一个和最后一个日期:
declare @date date = getdate()
select case
when MONTH(@date) in (11,12,1) then datefromparts(year(@date),8,1)
when MONTH(@date) in (8,9,10) then datefromparts(year(@date),5,1)
when MONTH(@date) in (5,6,7) then datefromparts(year(@date),2,1)
when MONTH(@date) in (2,3,4) then datefromparts(year(@date),11,1)
end StartOfPreviousQuarter,case
when MONTH(@date) in (11,30)
when MONTH(@date) in (8,31)
when MONTH(@date) in (5,7) then
CASE WHEN ISDATE(CAST(year(@date) AS char(4)) + '0229') = 1 THEN datefromparts(year(@date),29) ELSE datefromparts(year(@date),28) END
when MONTH(@date) in (2,30)
end EndOfPreviousQuarter
,
我会加上两个月,取季度的第一天,然后减去两个月:
SELECT DATEADD(month,-2,DATEADD(quarter,DATEDIFF(quarter,DATEADD(month,GETDATE())
) - 1,0
)
) as Special_Quarter_Date
我更倾向于使用 DATEFROMPARTS()
来写这个:
select dateadd(month,datefromparts( year(dateadd(month,getdate()),datepart(quarter,dateadd(month,getdate()) * 3 - 2
1
)
)
但逻辑完全一样:加两个月,计算季度,再减去两个月。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。