Php MySQL查询以显示日期在过去30天内的行数

Php MySQL查询以显示日期在过去30天内的行数,php,mysql,date,datetime,count,Php,Mysql,Date,Datetime,Count,非常基本的问题,我需要显示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'"); 输入的行显示了项目输入db ie

非常基本的问题,我需要显示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'");
输入的行显示了项目输入db ie 01/01/2012的日期。需要显示30、60和90天前输入的项目计数


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

我认为可以而且应该在一次查询中完成。试试这样的方法看看:

此查询将返回三行,指示每个范围的票证数量

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


假设票证输入时间戳/日期有一个日期友好列,则可以使用:

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

对于60和90,这很容易修改为单独的查询或or'ed,以及使用小于的选项。这可能会让您的头有点痛,但在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)

我个人更喜欢MySQL的本机函数DATE\u SUB与CURDATE/CURTIME/NOW结合使用。我建议你提出三个不同的问题,我认为你的思路是正确的。你的范围是什么?它们是30到59天,60到89天,以及90天以上吗?您只需在PHPUsing DATEDIFF函数中更改30天,输入>=timestadate\u SUBNOW,INTERVAL 30 day会比较便宜。这只会选择正好在30天前的日期。OP不清楚其查询所需的具体结果。对于添加60/90,一个简单的OR将允许在同一查询中显示其他结果。
SELECT COUNT(*) FROM  `DB_TABLE` 
WHERE DATE(`rowtimestamp`) = DATE(NOW() - INTERVAL 30 DAY)
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)