9

可能重复:
从数据库中获取但仅持续 30 天

嗨,我有一些 php 代码,用于计算过去 30 天数据库中的行数。问题是,如果我更改一段代码以使数字从-30变为-20,则输出数字会从272变为360而不是下降。

这是代码:

$result = mysql_query("SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) = -30 and member ='000002'");
$num_rows60 = mysql_num_rows($result);
4

4 回答 4

16

试试这个

select * from `table` where `yourfield` >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)

例如,对于天、年,请参见下文。

DATE_SUB(CURDATE(), INTERVAL 15 DAY) /*For getting record specific days*/

DATE_SUB(CURDATE(), INTERVAL 1 YEAR) /*for getting records specific years*/


对于 Anand,查询

BETWEEN DATE_SUB( CURDATE( ) ,INTERVAL 6 MONTH ) AND DATE_SUB( CURDATE() ,INTERVAL 3 MONTH ) 
/* For Getting records between last 6 month to last 3 month
于 2012-12-21T21:21:47.933 回答
3

比较好

`date`< DATE(NOW() - INTERVAL 30 DAY)

而不是

 DATEDIFF(date,NOW()) = -30

在第一种情况下,日期计算只进行一次,在查询开始时,数据库可以使用日期列上的任何索引。

第二个查询必须计算DATEDIFF每一行,数据库不能使用任何索引。第二个查询强制进行全表扫描。

另外,我强烈建议您不要致电您的专栏date。是的,我知道您可以用反引号引用该名称,但这很麻烦,当您忘记时,您的语法错误将很难忘记。为列想出一个更具描述性的名称。什么样的约会?日期代表什么?

于 2012-12-21T21:31:36.163 回答
2

您可以改用它:

$result = mysql_query("SELECT * FROM all_count WHERE `date`< DATE(NOW() - INTERVAL 30 DAY) and     member ='000002'");
于 2012-12-21T21:11:01.970 回答
0

正如您在此处的文档中看到的那样,MySQL中的DATEDIFF函数会告诉您第一个日期与第二个日期的天数差异。

您的查询仅选择差值正好为 30 天的所有行,而不是最多 30 天前的行。因此,20 天前日期的行数完全有可能高于 30 天前。您最可能想要的是:

SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) >= -30 and member ='000002'
于 2012-12-21T21:11:57.273 回答