2012-02-08 101 views
-1

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

我:

$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'"); 

进入行显示反映该项目已键入到数据库的日期(即01/01/2012)。需要显示30,60和90天前输入的项目数量。

不知道如果我在正确的道路上......

+1

我个人比较喜欢MySQL的本地函数DATE_SUB和CURDATE/CURTIME/NOW。我建议你做三个单独的查询,并且在我看来你是在正确的轨道上。 – Martijn 2012-02-08 18:45:34

+0

你的范围是什么?他们是30到59天,60到89天还是90+天? – 2012-02-08 19:16:03

+0

全部在一个查询中? – 2012-02-08 19:23:20

回答

0

我认为它可以(也应该)在一个查询来完成。尝试这样的事情(看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天的'门票数量。如果您想排除不同的范围,则必须修改查询。

+0

-2三张全表扫描。 – 2012-02-08 19:30:26

0

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) 
+0

(并且你可以在PHP中改变30) – DaOgre 2012-02-08 18:54:46

+0

使用DATEDIFF()函数将花费更少的代价'进入> = TIMESTAMP(DATE_SUB(NOW(),INTERVAL 30天)' – berty 2012-02-08 18:58:33

-1

假设你有票条目(时间戳/日期)的日期型列中,您可以使用:

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

这是60和90为易于修改单独查询(或OR'ed),以及使用小于(<),以防您不希望如此严格选择。

+0

-1全表扫描 – 2012-02-08 19:30:16

+0

这会只选择刚好在30天前的日期 – jjs9534 2012-02-08 20:21:36

+0

OP对他的查询所需的具体结果不清楚,对于添加60/90,简单的OR将允许在相同的查询中显示额外的结果。 – hexparrot 2012-02-09 17:59:09

0

这可能使你的头有点儿疼,但一排,在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) 
0

可以查询和组中的所有记录具有一个,简单的查询:

SELECT 
    CEIL((DATEDIFF(CURRENT_TIMESTAMP, entered)+1)/30) * 30 AS Batch, 
    COUNT(1) AS val 
FROM tickets 
GROUP BY Batch 

该查询使用通过30通过简单的算术到1之间组日期差异30,31 60 60等上。添加一个where子句来限制结果,比如90天。

相关问题