【问题标题】:Dates by quarter按季度划分的日期
【发布时间】:2015-07-22 04:51:50
【问题描述】:

我想在 SQL Server 中按季度计算生日数 即 1 月 1 日至 3 月 31 日、4 月 1 日至 6 月 30 日、7 月 1 日至 9 月 30 日和 10 月 1 日至 12 月 31 日。

请帮助我使用 Sql Server 中的 Date 函数来执行此操作。

我将 BDate 作为 DATETIME 传递。我想使用这个 BDate 来填充 4 个 int 类型的字段,其中包含每个季度的生日数。

谢谢。

【问题讨论】:

  • 您将日期字段存储为VARCHAR...?
  • 日期字段存储为 Int.
  • 我将 BDate 作为 DATETIME 传递。我想使用这个 BDate 来填充 4 个 int 类型的字段,其中包含每个季度的生日数
  • 请阅读 Christian Barron 提供的链接,然后返回并编辑您的问题以包括示例数据、预期输出、您尝试计算所需的 SQL 以及您拥有的关于那个 SQL 的问题。

标签: sql sql-server date


【解决方案1】:

数据设置:

create table test (
  d1 varchar(10),
  d2 datetime
);

insert into test (d1,d2) values ('2015-01-28','2015-01-28');
insert into test (d1,d2) values ('2015-02-13','2015-02-13');
insert into test (d1,d2) values ('2015-07-19','2015-07-19');
insert into test (d1,d2) values ('2015-11-04','2015-11-04');

如果您只想获取数据中每个季度的计数:

select DATEPART(QUARTER, d2), count(*)
from test
group by DATEPART(QUARTER, d2);

您可以使用 d1 或 d2(SQL Server 将正确处理 varchar 或 datetime)。

如果您想包括所有四个季度,即使它们不存在于您的数据中:

select qs.q, count(t.d2) as c
from (
  SELECT 1 as q
  UNION ALL
  SELECT 2 as q
  UNION ALL
  SELECT 3 as q
  UNION ALL
  SELECT 4 as q) qs
left join test t
on qs.q = DATEPART(QUARTER, t.d2)
group by qs.q;

同样,您可以使用 d1 或 d2,没关系。 “qs”查询只获取数字 1 到 4,然后将其外连接到包含出生日期的表。

【讨论】:

    【解决方案2】:

    只要您的“BDate”列是日期时间,您就可以使用以下查询轻松实现:

    SELECT DATEPART(QUARTER,BDATE), COUNT(*)
    FROM TABLE1
    GROUP BY DATEPART(QUARTER,BDATE)
    ORDER BY DATEPART(QUARTER,BDATE) ASC
    

    这是一个使用一些随机数据的工作小提琴:http://sqlfiddle.com/#!6/7734b/1

    【讨论】:

      【解决方案3】:

      请试试这个:

      --replace '19000102' with your int column
      select SUM(CASE WHEN  DATEPART(MONTH,CONVERT (datetime,convert(char(8),19000102)))    
          IN  (1,2,3)
        THEN 1
       ELSE 0
       END) as 'Q1',
       SUM(CASE WHEN  DATEPART(MONTH,CONVERT (datetime,convert(char(8),19000102))) 
          IN  (4,5,6)
        THEN 1
       ELSE 0
       END) as 'Q2',
       SUM(CASE WHEN  DATEPART(MONTH,CONVERT (datetime,convert(char(8),19000102))) 
          IN  (7,8,9)
        THEN 1
       ELSE 0
       END) as 'Q3',
       SUM(CASE WHEN  DATEPART(MONTH,CONVERT (datetime,convert(char(8),19000102))) 
          IN  (10,11,12)
        THEN 1
       ELSE 0
       END) as 'Q4'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        相关资源
        最近更新 更多