SQL Server 2012。
我们有一个使用非标准季度报告的业务部门。季度从11月开始,10月结束。更确切地说,Q1: 11月至1月;Q2: 2月至4月;Q3: 5月至7月;Q4: 8月至10月。
我正在尝试创建一个“简单而高效”的查询,它可以接受给定的日期,并根据这个非标准方案返回前一个“季度”的第一个日期和最后一个日期。
以前的一位同事曾使用复杂的case表达式处理过这个问题,这非常笨拙,我想找到一种更好的方法。
我知道SQL server有一些内置的日期逻辑来处理季度,但只有标准的日历季度。因此,以下代码将可靠地返回上一季度的第一天,但只返回从1月份开始到12月份结束的季度的标准方案……
SELECT DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) - 1, 0)
--Shows first day of prior quarter, but only for 'standard' quarters我天真地认为只要减去两个月就可以了,但这在三分之二的时间里是错误的。
SELECT DATEADD(month, -2, DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) - 1, 0))
--Works for 1/3 dates从那时起,我尝试了各种嵌套计算方案,但没有得到任何有效的方案。
是否有人可以帮助我进行此计算-或者,您是否建议我只创建一个日期表,让我查找非标准季度?谢谢
发布于 2021-02-04 20:11:42
我会加上两个月,取这个季度的第一天,然后减去两个月:
SELECT DATEADD(month, -2,
DATEADD(quarter,
DATEDIFF(quarter, 0, DATEADD(month, 2, GETDATE())
) - 1, 0
)
) as Special_Quarter_Date我更倾向于使用DATEFROMPARTS()编写这篇文章
select dateadd(month, -2,
datefromparts( year(dateadd(month, 2, getdate()),
datepart(quarter, dateadd(month, 2, getdate()) * 3 - 2
1
)
)但逻辑是完全相同的:加两个月,计算季度,减去两个月。
发布于 2021-02-04 19:37:16
你可以使用下面的查询:
DECLARE @mydate DATETIME ='2020-04-04'
SELECT
CASE
WHEN MONTH(@mydate) BETWEEN 2 AND 4 THEN CAST(YEAR(@mydate) - 1 as varchar)+'-11-01'
WHEN MONTH(@mydate) BETWEEN 5 AND 7 THEN CAST(YEAR(@mydate) as varchar)+'-02-01'
WHEN MONTH(@mydate) BETWEEN 8 AND 10 THEN CAST(YEAR(@mydate) as varchar)+'-05-01'
WHEN MONTH(@mydate) in(11,12) THEN CAST(YEAR(@mydate) as varchar)+'-08-01'
WHEN MONTH(@mydate)=1 THEN CAST(YEAR(@mydate) -1 as varchar)+'-08-01'
END AS Start_date,
CASE
WHEN MONTH(@mydate) BETWEEN 2 AND 4 THEN CAST(YEAR(@mydate) as varchar)+'-01-31'
WHEN MONTH(@mydate) BETWEEN 5 AND 7 THEN CAST(YEAR(@mydate) as varchar)+'-04-30'
WHEN MONTH(@mydate) BETWEEN 8 AND 10 THEN CAST(YEAR(@mydate) as varchar)+'-07-31'
WHEN MONTH(@mydate) in(11,12) THEN CAST(YEAR(@mydate) as varchar)+'-10-31'
WHEN MONTH(@mydate)=1 THEN CAST(YEAR(@mydate) -1 as varchar)+'-10-31'
END AS End_date发布于 2021-02-04 19:42:40
您可以根据需要使用以下查询确定上一季度的第一个日期和最后一个日期:
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,12,1) then datefromparts(year(@date),8,30)
when MONTH(@date) in (8,9,10) then datefromparts(year(@date),5,31)
when MONTH(@date) in (5,6,7) then
CASE WHEN ISDATE(CAST(year(@date) AS char(4)) + '0229') = 1 THEN datefromparts(year(@date),2,29) ELSE datefromparts(year(@date),2,28) END
when MONTH(@date) in (2,3,4) then datefromparts(year(@date),11,30)
end EndOfPreviousQuarterhttps://stackoverflow.com/questions/66044044
复制相似问题