首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL日期逻辑-查找之前的*非标准*季度

SQL日期逻辑-查找之前的*非标准*季度
EN

Stack Overflow用户
提问于 2021-02-04 18:45:37
回答 3查看 72关注 0票数 2

SQL Server 2012。

我们有一个使用非标准季度报告的业务部门。季度从11月开始,10月结束。更确切地说,Q1: 11月至1月;Q2: 2月至4月;Q3: 5月至7月;Q4: 8月至10月。

我正在尝试创建一个“简单而高效”的查询,它可以接受给定的日期,并根据这个非标准方案返回前一个“季度”的第一个日期和最后一个日期。

以前的一位同事曾使用复杂的case表达式处理过这个问题,这非常笨拙,我想找到一种更好的方法。

我知道SQL server有一些内置的日期逻辑来处理季度,但只有标准的日历季度。因此,以下代码将可靠地返回上一季度的第一天,但只返回从1月份开始到12月份结束的季度的标准方案……

代码语言:javascript
复制
SELECT DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) - 1, 0) 
--Shows first day of prior quarter, but only for 'standard' quarters

我天真地认为只要减去两个月就可以了,但这在三分之二的时间里是错误的。

代码语言:javascript
复制
SELECT DATEADD(month, -2, DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) - 1, 0))
--Works for 1/3 dates

从那时起,我尝试了各种嵌套计算方案,但没有得到任何有效的方案。

是否有人可以帮助我进行此计算-或者,您是否建议我只创建一个日期表,让我查找非标准季度?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-04 20:11:42

我会加上两个月,取这个季度的第一天,然后减去两个月:

代码语言:javascript
复制
SELECT DATEADD(month, -2,
               DATEADD(quarter,
                       DATEDIFF(quarter, 0, DATEADD(month, 2, GETDATE())
                               ) - 1, 0
                       )
              ) as Special_Quarter_Date

我更倾向于使用DATEFROMPARTS()编写这篇文章

代码语言:javascript
复制
select dateadd(month, -2,
               datefromparts( year(dateadd(month, 2, getdate()),
                              datepart(quarter, dateadd(month, 2, getdate()) * 3 - 2
                              1
                            )
               )

但逻辑是完全相同的:加两个月,计算季度,减去两个月。

票数 2
EN

Stack Overflow用户

发布于 2021-02-04 19:37:16

你可以使用下面的查询:

代码语言:javascript
复制
    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
票数 0
EN

Stack Overflow用户

发布于 2021-02-04 19:42:40

您可以根据需要使用以下查询确定上一季度的第一个日期和最后一个日期:

代码语言:javascript
复制
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 EndOfPreviousQuarter
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66044044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档