获取最近30天的Mysql查询结果

10
可能重复:

从数据库获取但仅限最近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);

请显示在 SQL 中 3 个月前的记录。完整描述请参阅同一问题的链接:https://dev59.com/CWYr5IYBdhLWcg3wJ3GU#13912197 - softsdev
您正在选择恰好为30或20天的记录。 - JJJ
4个回答

17

试一试

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

哇,非常好,这个完全解释得很清楚。 - user1749185
谢谢,你的解释真的帮助我理解了区别以及应该如何做。非常感谢! - Sam Williams

3

最好进行比较

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

相比于
 DATEDIFF(date,NOW()) = -30

在第一种情况下,日期计算仅在查询开始时进行一次,并且数据库可以使用日期列上的任何索引。
第二个查询必须在每行上计算DATEDIFF,并且数据库无法使用任何索引。第二个查询强制执行完整的表扫描。
此外,我强烈建议您不要将列命名为“date”。是的,我知道您可以用反引号引用名称,但这只会使事情变得混乱,并且当您忘记时,您的语法错误将难以忘记。为该列想出一个更具描述性的名称。它是什么类型的日期?日期表示什么?

2
您可以使用这个替代方案:
$result = mysql_query("SELECT * FROM all_count WHERE `date`< DATE(NOW() - INTERVAL 30 DAY) and     member ='000002'");

0

正如您在此处的文档中所看到的,MySQL中的DATEDIFF函数可以告诉您第一个日期与第二个日期之间的天数差异。

您的查询仅选择所有差异恰好为30天的行,而不是那些最多30天前的行。因此,有可能20天前的日期的行数比30天前的日期更高。您最可能想要的是:

SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) >= -30 and member ='000002'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接