用sql语句求本季度比上一个季度多多少天

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用sql语句求本季度比上一个季度多多少天相关的知识,希望对你有一定的参考价值。

用sql求本季度比上一个季度多多少天

--计算给定日期所在季度的天数
declare @date datetime;
set @date = getdate()
--本季度第一天与下季度第一天所差的天数
select datediff(day,dateadd(quarter,datediff(quarter,0,@date),0),dateadd(quarter,1+datediff(quarter,0,@date),0))
--借助变量简化
select @date = dateadd(quarter,datediff(quarter,0,@date),0) --本季度第一天
select datediff(day,@date,dateadd(quarter,1,@date))
go
算出本季及前一季各自的天数,再减一下,即可。
参考技术A datediff函数,本季度的开始日期如2019年1月1日,上季度的开始日期如2018年9月1日,下季度的开始日期如2019年4月1日,相临季度开始日期日期差相减即可。至于怎么定位开始日期需根据当前时间变换得到。

还可以根据是否是平年每月的天数经过变换得出答案

如何使用sql server查询前8个季度的季度数据报表?

【中文标题】如何使用sql server查询前8个季度的季度数据报表?【英文标题】:How to query previous 8 quarters for quarterly data report using sql server? 【发布时间】:2020-12-08 06:21:29 【问题描述】:

我想查询从今天开始的前 8 个季度。

示例:从今天开始的最后一个季度 = '2020-09-30',从今天开始的最后 8 个季度是'2018-10-01'。

我希望在查询结果中将前 8 个季度 ('2018-10-01') 标记为 Q1 而不是 Q4,因为它是 2018 年的第四季度。Q2 将是从 1 月开始的下一个季度- 2019 年 3 月等等。

有没有办法从开始日期算到当前日期?

我当前的查询:

    SELECT
       name, 
       Q1, 
       Q2, 
       Q3, 
       Q4, 
       Q5, 
       Q6, 
       Q7, 
       Q8, 
FROM   (SELECT distinct
               s.custId,
               sum(s.total) as total,
               CAST('Q'+ Cast(DATEPART(QUARTER, s.purchaseDate)AS VARCHAR(1)) AS VARCHAR(2)) AS Quarterly,
               c.name, 
        FROM   sales s 
               LEFT OUTER JOIN customers c 
                            ON c.id = s.custId
        WHERE  AND purchaseDate >= '2018-10-01' 
               AND purchaseDate <= '2020-09-30' 
        GROUP BY 
                s.custId) AS data
       PIVOT ( SUM(total) 
             FOR quarterly IN ([Q1], 
                               [Q2], 
                               [Q3], 
                               [Q4], 
                               [Q5], 
                               [Q6], 
                               [Q7], 
                               [Q8]) )AS pvt

       ORDER by name

【问题讨论】:

【参考方案1】:

我只会使用条件聚合:

SELECT s.custId, c.name,
       SUM(CASE WHEN DATEDIFF(quarter, s.purchasedate, GETDATE()) = 8
                THEN s.total
           END) as q1,
       SUM(CASE WHEN DATEDIFF(quarter, s.purchasedate, GETDATE()) = 7
                THEN s.total
           END) as q2,
       . . .
FROM sales s LEFT OUTER JOIN
     customers c 
     ON c.id = s.custId AND
WHERE purchaseDate >= '2018-10-01' AND
      purchaseDate <= '2020-09-30' 
GROUP BY s.custId, c.name;

【讨论】:

【参考方案2】:

对于“硬编码”方法,您可以将 Quarterly 定义为 9-quarterdiff(between purchaseDate&current date) [或 9+quarterdiff(between current date&purchaseDate]

declare @sales table (purchaseDate date, total int);

insert into @sales(purchaseDate, total)
values
('20181016', 4), ('20181220', 5), 
('20190219', 6), 
('20190524', 11), ('20190620', 7), 
('20190708', 12),
('20200210', 20),
('20200923', 19), ('20200926', 11),
('20201111', 2) --this is q9
;


--9&quarterdiff (when/if checking !!previous 8 quarters only!!)
select pvt.*
from
(
select total, 
  concat('Q', 9-datediff(quarter, purchaseDate, getdate())) as Quarterly
  --concat('Q', 9+datediff(quarter, getdate(), purchaseDate)) as Quarterly
from @sales
where purchaseDate >= '20181001' 
and purchaseDate <= '20200930' -- or maybe.. < '20201001', even if it's a date datatype
) as s
pivot
(
sum(total) for Quarterly in (Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8)
) as pvt;

【讨论】:

以上是关于用sql语句求本季度比上一个季度多多少天的主要内容,如果未能解决你的问题,请参考以下文章

怎么用Sql语句把日期转换为季度或者年度

sql语句怎么描述上个季度的时间范围

SQL语句:取某个日期所在季度的最后一天,精确到时分秒

mysql按年度季度月度周日统计查询的sql语句

SQL语句 如何取得指定月份的最后一天的日期

如何 用mysql语句获取本季度的第一天 本月