选择30天之前的所有记录

时间:2012-02-01 23:14:27

标签: mysql perl

我需要选择30天以前的所有记录。我有下面的代码,但它不起作用。在updatestatus中,我的日期为12/26/2011。我创建了一个30天的日期,如

$onemonthago="01/01/2012";
$sth = $dbh->prepare(qq(
        SELECT * 
        FROM people 
        WHERE STR_TO_DATE (updatestatus,'%m/%d/%y') 
              <= STR_TO_DATE ( "$onemonthago",'%m/%d/%Y')
                    )  );

4 个答案:

答案 0 :(得分:7)

如果updatestatus的数据类型为date

SELECT * 
FROM people 
WHERE updatestatus <= '2012-01-01'

或:

SELECT * 
FROM people 
WHERE updatestatus <= CURRENT_DATE() - INTERVAL 1 MONTH

如果数据类型为datetimetimestamp,您也想检查时间部分:

SELECT * 
FROM people 
WHERE updatestatus <= NOW() - INTERVAL 1 MONTH

您可以输入确切的日期时间而不是NOW() - INTERVAL 1 MONTH。正确的方法取决于您存储日期时间或时间戳的方式(Perl代码或MySQL是否首先创建它们?)。

你也可以放- INTERVAL 30 DAY,结果略有不同。

答案 1 :(得分:6)

这就是我用的。非常简单

$sth = $dbh->prepare(qq(SELECT * FROM people WHERE updatestatus + INTERVAL 30 DAY <=     NOW() )) or die $DBI::errstr;

答案 2 :(得分:2)

您可以尝试这种方式。在SQL中,有dateadd函数,我认为在MySQL中应该有类似的功能。

select *
from Table
where str_to_date between dateadd(day,-30,getdate()) and getdate()

它检索当前日期和过去30天之间的记录。你需要调整时间。如果您不计算时间,则需要删除时间戳。

答案 3 :(得分:1)

如果时间列在时间戳中,则使用以下查询。(使用from_unixtime函数)

SELECT wd.* FROM `watchdog` as wd
WHERE  from_unixtime(wd.timestamp) <= NOW() - INTERVAL 1 MONTH