2012-03-28 80 views
8

所以这里是情况。在我的数据库表中,我有一个名为expire_date的列,我为每行放置了一个确定的日期。 因此,例如截止日期是2012年4月28日php取得日期-1月

我需要一个PHP代码,将通过电子邮件发送某个用户的通知,该日期到期的某些事情是从过期1个月。所以如果今天是28-03-2012,那就意味着在该事情到期之前只有1个月。 我没有为此做任何代码,因为我不知道如何解决-1个月。

回答

13

首先获得SQL的日期在一个月内使用PHP:

$myDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime(date("Y-m-d"))) . "+1 month")); 

然后,你可以做一个选择:

$result = mysql_query('SELECT * FROM myTable WHERE expire_date BETWEEN NOW AND "' . $myDate . '"'); 

而且你有一个数组,其中包含所有在不到一个月内到期的项目。 如果你想正是1个月内到期的那些:

$result = mysql_query('SELECT * FROM myTable WHERE expire_date = "' . $myDate . '"'); 

我希望这有助于

+0

谢谢。得到它的工作! – gogu 2012-03-28 16:18:55

+1

@Tales你实际上应该能够使用1 less date()函数获得相同的日期,如:date('Ym-d',strtotime(date('Ym-d')。'+1 month')) ;' – OnethingSimple 2015-07-15 14:59:40

+1

@Tales实际上,我猜只是'echo date('Ym-d',strtotime('+ 1 month'));'对吗? – OnethingSimple 2015-07-15 15:15:43

1
SELECT user, email FROM tbl WHERE expire_date = CURRENT_TIMESTAMP - INTERVAL 1 MONTH 

请注意,我用=和不小于,因为如果你只是比较,它的不到一个月的时间,那么你将每天的最后一个月内发送电子邮件的用户。

+0

这选择一个月前过期的记录。 – 2012-03-28 16:05:24

0

你可能需要把你的日期字符串变成unix时间,然后做一个选择日期。 (我假设你使用sql)。

SELECT * FROM table WHERE (SELECT datediff(now(),your-date-in-unixtime) > 30) 
+0

您应该避免在您尝试过滤的字段上使用函数,因为它会使索引不可用。 – nnichols 2012-03-28 16:25:03

1

你可以在你的MySQL Query中使用ADDDATE()函数。

> SELECT ADDDATE( '28-03-2012', INTERVAL 1 MONTH) 
28-04-2012 

更多关于它here

WHERE expire_date = ADDDATE(CURDATE(), INTERVAL 1 MONTH) 

(更多关于CURDATE()here

如果:

如果您对您的expire_date列的索引,这可能是非常快,如果你查询的条目有WHERE声明像做你每天只需要一次它只会选择所有人最多一次,并且不会向他们发送两次电子邮件,因为它只会选择那些距离其过期日正好一个月的邮件。

当然,如果您在MySQL表中使用DATE字段类型,则无需额外关心日期的具体表示。

3

也许你应该在SQL而不是PHP中做到这一点?

如果你想要做在PHP,这里比@Expert一个更清洁的方式想

$date = new DateTime();//now 
$interval = new DateInterval('P1M');// P[eriod] 1 M[onth] 
$date->sub($interval); 
echo $date->format('Y-m-d');  
-1

对于您可以使用下面的查询

SELECT * 
FROM tablename 
WHERE DATE_FORMAT(created_at, '%Y/%m/%d') = (CURDATE() + INTERVAL 1 MONTH) 
+0

你应该总是避免这样做。使用DATE/DATETIME字段中的'DATE_FORMAT()'要过滤将会导致任何索引无用。 – nnichols 2012-03-28 16:22:29

2

正如指出的@Mikhail你应该使用=,所以你只检索记录一次。你不想成为日常生活垃圾邮件用户整个月的运行到EXPIRE_DATE -

SELECT * 
FROM tbl 
WHERE expire_date = CURRENT_DATE + INTERVAL 1 MONTH 

如果EXPIRE_DATE包含,而不是你应该使用类似一个Date值DATETIME -

SELECT * 
FROM tbl 
WHERE expire_date BETWEEN (CURRENT_DATE + INTERVAL 1 MONTH) AND (CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY - INTERVAL 1 SECOND) 
5

简单地;

$WeekAgo = strtotime("-1 week"); //A week before today 
    $MonthAgo = strtotime("-1 month"); //A month before today