【问题标题】:Counting between dates日期之间的计数
【发布时间】:2018-10-14 20:40:51
【问题描述】:

我需要所有日期的计数,包括不存在的日期

SELECT ifnull(COUNT(*),0) as num , date_format(c.dataCupo,"%d/%m/%Y") as data FROM cupons c WHERE c.dataCupo between "2017-02-02" AND "2018-05-04" AND c.proveidor!="VINCULADO" and c.empresa=1 group by date_format(c.dataCupo,"%Y-%m-%d")

//我需要计算所有月份,包括不存在的月份

SELECT ifnull(COUNT(*),0) as num , date_format(c.dataCupo,"%m/%Y") as data
FROM cupons c 
WHERE c.dataCupo between "2017-02-02" AND "2018-05-04" AND c.proveidor!="VINCULADO" and c.empresa=1
group by date_format(c.dataCupo,"%Y-%m")

//我需要计算所有年份,包括不存在的年份

SELECT ifnull(COUNT(*),0) as num , date_format(c.dataCupo,"%Y") as data
FROM cupons c 
WHERE c.dataCupo between "2015-02-02" AND "2018-05-04" AND c.proveidor!="VINCULADO" and c.empresa=1
group by date_format(c.dataCupo,"%Y")

我想要的结果:

2017 年 2 月 2 日 | 10

2017 年 3 月 2 日 | 0

2017 年 4 月 2 日 | 2

2017 年 5 月 2 日 | 0 ....

02/2017 | 50

03/2017 | 0

04/2017 | 10

2015 | 0

2016 | 10

2017 | 15

2018 | 0

【问题讨论】:

标签: mysql date count ifnull


【解决方案1】:

您应该创建一个临时表来存储您的日期范围之间的所有日期范围

    CREATE TEMPORARY TABLE IF NOT EXISTS AllDateRange engine=memory 
 SELECT DATE(cal.date) Date
 FROM ( 
  SELECT  ( case when  @prmToDate = @prmFromDate then @prmFromDate else

  SUBDATE( @prmFromDate, INTERVAL  (DATEDIFF(@prmToDate,@prmFromDate))  DAY) + INTERVAL xc DAY end ) AS Date 
  FROM ( 
        SELECT @xi:=@xi+1 as xc from 
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc1, 
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc2, 
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc3, 
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc4, 
        (SELECT @xi:=+1) xc0 
  ) xxc1 
   ) cal WHERE DATE( cal.date)  >=  DATE(@prmFromDate)  and DATE( cal.date) <= DATE(@prmToDate)    ;

然后将它与您的表作为连接。

SELECT   count(COALESCE(c.empresa, 0)) as num ,   date_format(a.Date,"%d/%m/%Y") as data from AllDateTimeRange a 
 left join cupons c  on a.Date=date_format(c.dataCupo,"%Y-%m-%d") 
 WHERE c.dataCupo between @prmFromDate AND @prmToDate  AND  c.proveidor!="VINCULADO" and c.empresa=1 
 group by date_format(c.dataCupo,"%Y-%m-%d");

类似地创建月份和年份的临时表,然后加入您的主表,如上所述,以便分别获得月份和年份所需的结果。

【讨论】:

    【解决方案2】:

    最简单的方法是使用日历表。该表将有一个您可以加入的日期时间列,并且对于报告非常有用。这是一个如何在 MySQL 中制作的示例。

    https://gist.github.com/bryhal/4129042

    现在您有了日历表,您可以加入它以查找日期范围内所有日期的计数。

    全天示例:

    select num, td.db_date
    FROM 
    time_dimension td 
    left join 
       (SELECT ifnull(COUNT(*),0) as num , c.dataCupo as data
       FROM cupons c 
       WHERE c.dataCupo between "2017-02-02" AND "2018-05-04" AND 
          c.proveidor!="VINCULADO" and c.empresa=1
       group by c.dataCupo) t
    on t.data  = td.db_date
    WHERE td.db_date between "2017-02-02" AND "2018-05-04" 
    

    所有月份示例:

    select 
        sum(t.num),
        CONCAT(month(td.db_date),"-",year(td.db_date))
    FROM 
    time_dimension td 
    left join 
       (SELECT 
           ifnull(COUNT(*),0) as num , 
           c.dataCupo as data
       FROM cupons c 
       WHERE c.dataCupo between "2017-02-02" AND "2018-05-04" AND 
          c.proveidor!="VINCULADO" and c.empresa=1) t
    
    on c.data = t.data 
    WHERE td.db_date between "2017-02-02" AND "2018-05-04" 
    group by CONCAT(month(td.db_date),"-",year(td.db_date))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多