我需要选择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')
) );
答案 0 :(得分:7)
如果updatestatus
的数据类型为date
:
SELECT *
FROM people
WHERE updatestatus <= '2012-01-01'
或:
SELECT *
FROM people
WHERE updatestatus <= CURRENT_DATE() - INTERVAL 1 MONTH
如果数据类型为datetime
或timestamp
,您也想检查时间部分:
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