【问题标题】:Count rows added today, yesterday...and other times计算今天、昨天...和其他时间添加的行数
【发布时间】:2010-10-11 07:35:58
【问题描述】:

我今天从这里得到了解决问题的好方向,但我一直在尝试遵循这个方向。

我想使用我的date field 从表中检索过去30 days 的所有行的count。我使用now() 填充这些字段,格式为Y-m-d h:i:s

  • 我需要count 用于添加的行 今天、昨天、3 天前……等等
  • 我想我可以使用上面的 计算每个月?
  • 最后一个count 一年,一年 之前等使用总月份?

我希望不在我的查询中指定日期,并且希望查询只是通用的并计算出相对于今天的计数。考虑到不同的月份有不同的天数,我也希望我也能准确地做到这一点。

我怎样才能使用仅使用 SQL 获得这个 count?然后我可以将结果集用作数组并使用PHP 解析它。

【问题讨论】:

  • 嗯,为什么只有 SQL?为什么不在你的应用程序代码中加入一些逻辑呢?
  • 我希望它在数据库查询级别会更简单、更高效,不是吗?
  • 阅读MySql的日期时间函数,有点创意。这应该可以解决问题。
  • Abs,处理数据库中的数据总是更高效。即使您以程序方式进行。 @jonstjohn,如果有一百万条消息,您会将所有消息发送到应用程序,而不仅仅是结果? {我在你的视线中畏缩}

标签: mysql sql count


【解决方案1】:

昨天插入的记录数:

select count(*) from mytable where date(myfield)=date(date_sub(now(),interval 1 day));

当年:

select count(*) from mytable where year(myfield)=year(now());

等等……

【讨论】:

  • 等等,你想要它是累积的吗?对我来说没有意义。昨天设置了多少消息,应该包括我今天发送了多少。你会更清楚吗?
  • 您可以通过将 = 更改为 >= 来使其累积,但我想您知道。
【解决方案2】:

查看 MySQL 的 DATE_ADDDATE_SUB 函数,它将为您提供所需的内容。

【讨论】:

    【解决方案3】:

    我不完全确定您的数据库结构是什么样的,但您可以使用GROUP BY 实现您想要的:

    按天汇总:

    SELECT date(my_date_field) d, count(*) c FROM tbl
    GROUP BY d
    ORDER BY d
    

    按月汇总:

    SELECT year(my_date_field) y, month(my_date_field) m, count(*) c FROM tbl
    GROUP BY y, m
    ORDER BY y, m
    

    要按年份汇总,您只需从上面的示例中删除月份参数即可。

    如果您想limit 将结果显示为具体细节,您可以直接在my_date_field 上使用WHERE 或在d、y 或m 上使用HAVING。使用DATE_SUB 计算相对于当前日期的日期。

    【讨论】:

      【解决方案4】:

      查看 DATEDIFF...我不确定 mysql 的确切语法,但它最终应该类似于:

      select * from Table WHERE datediff(StartDate, Today) < DaySpan
      

      【讨论】:

        【解决方案5】:

        根据按日期、月份和年份分组尝试此解决方案:

        -- Testing data
        DECLARE @TestTable TABLE(ID INT, AddDate DATETIME)
        INSERT INTO @TestTable
        SELECT 1, '2009-03-04 14:58:01' UNION
        SELECT 1, '2009-05-14 14:58:01' UNION
        SELECT 1, '2009-05-14 14:58:02' UNION
        SELECT 1, '2009-05-24 14:58:01' UNION
        SELECT 1, '2009-05-24 14:58:02' UNION
        SELECT 1, '2009-05-24 14:58:03' UNION
        SELECT 1, '2009-07-04 14:58:01' UNION
        SELECT 1, '2009-09-04 14:58:01' UNION
        SELECT 1, '2010-01-04 14:58:01' UNION
        SELECT 1, '2010-03-04 14:58:01' UNION
        SELECT 1, '2010-03-04 14:58:02'
        
        -- MySQL Answer
        -- for each day
        SELECT EXTRACT(YEAR_MONTH_DAY, AddDate), COUNT(ID) FROM @TestTable
        GROUP BY EXTRACT(YEAR_MONTH_DAY, AddDate)
        -- for each month
        SELECT EXTRACT(YEAR_MONTH, AddDate), COUNT(ID) FROM @TestTable
        GROUP BY EXTRACT(YEAR_MONTH, AddDate)
        -- for each year
        SELECT EXTRACT(YEAR, AddDate), COUNT(ID) FROM @TestTable
        GROUP BY EXTRACT(YEAR, AddDate)
        
        -- SQL Answer
        -- for each day
        SELECT dateadd(day, datediff(day, 0, AddDate)+0, 0), COUNT(ID) 
        FROM @TestTable
        GROUP BY dateadd(day, datediff(day, 0, AddDate)+0, 0)
        -- for each month
        SELECT dateadd(month, datediff(month, 0, AddDate)+0, 0), COUNT(ID) 
        FROM @TestTable
        GROUP BY dateadd(month, datediff(month, 0, AddDate)+0, 0)
        -- for each year
        SELECT dateadd(year, datediff(year, 0, AddDate)+0, 0), COUNT(ID) 
        FROM @TestTable
        GROUP BY dateadd(year, datediff(year, 0, AddDate)+0, 0)
        

        【讨论】:

          猜你喜欢
          • 2023-01-30
          • 2016-05-28
          • 2014-05-25
          • 2021-10-29
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多