MySQL查询显示过去30天中日期所在的行数


MySQL query to show count of rows where date is in the past 30 days

非常基本的问题,我需要显示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'");

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

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

我认为它可以(也应该)在一个查询中完成。试试这样的东西(看看DATEDIFF()函数):

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天"的机票数量。如果要排除不同的范围,则必须调整查询。

MySQL获取n天前的日期作为时间戳

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

这可能会让你的头有点疼,但在30天、31-60天和61-90天内,一行三列。。。

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)

假设票证条目有一个日期友好列(时间戳/日期),则可以使用:

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

对于60和90,可以很容易地将其修改为单独的查询(或or’ed),也可以使用小于(<)以防您不希望如此严格地选择它。