2012-03-28 81 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