【问题标题】:MySQL query to show count of rows where date is in the past 30 daysMySQL 查询以显示过去 30 天内日期的行数
【发布时间】:2012-03-01 05:56:54
【问题描述】:

非常基本的问题,我需要显示 30 天前输入的项目计数(与今天/当前时间戳相比)。也需要在 60 和 90 天内这样做。

我有:

$format = 'Y-m-j G:i:s'; 
$d = date( $format, strtotime ( '-30 days' ) );
$db->query_first("SELECT COUNT( * ) AS val FROM ".DB_TABLE."tickets WHERE entered <= '$d'");

entered 行显示了项目被键入数据库的日期(即 2012 年 1 月 1 日)。需要显示 30、60 和 90 天前输入的项目的计数。

不确定我是否走在正确的道路上......

【问题讨论】:

  • 我个人更喜欢 MySQL 的原生函数 DATE_SUB 结合 CURDATE / CURTIME / NOW。我建议您进行三个单独的查询,我认为您走在正确的轨道上。
  • 你的范围是多少?它们是 30 到 59 天、60 到 89 天还是 90 多天?

标签: php mysql date datetime count


【解决方案1】:

我认为它可以(并且应该)在一个查询中完成。试试这样的事情(看看DATEDIFF() function):

mysql_query('(
    SELECT 30 AS numDays, count(*) AS numTickets FROM tickets WHERE DATEDIFF(NOW(), tickets.entered) <= 30
)
UNION ALL
(
    SELECT 60 AS numDays, count(*) AS numTickets FROM tickets WHERE DATEDIFF(NOW(), tickets.entered) <= 60
)
UNION ALL
(
    SELECT 90 AS numDays, count(*) AS numTickets FROM tickets WHERE DATEDIFF(NOW(), tickets.entered) <= 90
)');

此查询将返回三行,表示每个范围的票数。

注意:“60 天”门票的数量将包含“30 天”门票的数量。如果要排除不同的范围,则必须调整查询。

【讨论】:

    【解决方案2】:

    MySQL get the date n days ago as a timestamp

     SELECT count(*) AS val FROM {table} 
     WHERE entered >= TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 day)
    

    【讨论】:

    • (你可以在 PHP 中更改 30)
    • 使用 DATEDIFF() 函数会比 entered &gt;= TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 day) 更便宜
    【解决方案3】:

    假设您有一个用于工单条目的日期友好列(时间戳/日期),您可以使用:

    SELECT COUNT(*) FROM  `DB_TABLE` 
    WHERE DATE(`rowtimestamp`) = DATE(NOW() - INTERVAL 30 DAY)
    

    这很容易将 60 和 90 修改为单独的查询(或 OR'ed),以及使用小于 (

    【讨论】:

    • 这只会选择正好是 30 天前的日期。
    • OP 不清楚他的查询所需的具体结果。对于添加 60/90,简单的 OR 将允许在同一查询中显示其他结果。
    【解决方案4】:

    这可能会让你有点头疼,但是在 30、31-60 和 61-90 天内,一行包含所有 3 列......

    SELECT
          sum( if( TK.entered >= @OneMonthAgo, 1, 0 )) CountWithin30,
          sum( if( TK.entered >= @TwoMonthsAgo and TK.entered < @OneMonthAgo, 1, 0 ) as Count31To60,
          sum( if( TK.entered >= @ThreeMonthsAgo and TK.entered < @TwoMonthsAgo, 1, 0 ) as Count61To90
       FROM
          ( @OneMonthAgo := date_sub( Now(), Interval 30 day ),
            @TwoMonthsAgo := date_sub( @OneMonthAgo, Interval 30 day ),
            @ThreeMonthsAgo := date_sub( @TwoMonthsAgo, Interval 30 day ) ) SqlVars,
          DB_TABLE.tickets TK
       where
          TK.entered >= date_sub( now(), interval 90 day)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多