所以這裏是情況。在我的數據庫表中,我有一個名爲expire_date的列,我爲每行放置了一個確定的日期。 因此,例如截止日期是2012年4月28日php取得日期-1月
我需要一個PHP代碼,將通過電子郵件發送某個用戶的通知,該日期到期的某些事情是從過期1個月。所以如果今天是28-03-2012,那就意味着在該事情到期之前只有1個月。 我沒有爲此做任何代碼,因爲我不知道如何解決-1個月。
所以這裏是情況。在我的數據庫表中,我有一個名爲expire_date的列,我爲每行放置了一個確定的日期。 因此,例如截止日期是2012年4月28日php取得日期-1月
我需要一個PHP代碼,將通過電子郵件發送某個用戶的通知,該日期到期的某些事情是從過期1個月。所以如果今天是28-03-2012,那就意味着在該事情到期之前只有1個月。 我沒有爲此做任何代碼,因爲我不知道如何解決-1個月。
首先獲得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 . '"');
我希望這有助於
echo strtotime("-1 day"); //1332864156
echo date("y-m-d",strtotime("-1 day")); // 12-03-27
SELECT user, email FROM tbl WHERE expire_date = CURRENT_TIMESTAMP - INTERVAL 1 MONTH
請注意,我用=
和不小於,因爲如果你只是比較,它的不到一個月的時間,那麼你將每天的最後一個月內發送電子郵件的用戶。
這選擇一個月前過期的記錄。 – 2012-03-28 16:05:24
你可能需要把你的日期字符串變成unix時間,然後做一個選擇日期。 (我假設你使用sql)。
SELECT * FROM table WHERE (SELECT datediff(now(),your-date-in-unixtime) > 30)
您應該避免在您嘗試過濾的字段上使用函數,因爲它會使索引不可用。 – nnichols 2012-03-28 16:25:03
你可以在你的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字段類型,則無需額外關心日期的具體表示。
也許你應該在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');
對於您可以使用下面的查詢
SELECT *
FROM tablename
WHERE DATE_FORMAT(created_at, '%Y/%m/%d') = (CURDATE() + INTERVAL 1 MONTH)
你應該總是避免這樣做。使用DATE/DATETIME字段中的'DATE_FORMAT()'要過濾將會導致任何索引無用。 – nnichols 2012-03-28 16:22:29
正如指出的@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)
簡單地;
$WeekAgo = strtotime("-1 week"); //A week before today
$MonthAgo = strtotime("-1 month"); //A month before today
謝謝。得到它的工作! – gogu 2012-03-28 16:18:55
@Tales你實際上應該能夠使用1 less date()函數獲得相同的日期,如:date('Ym-d',strtotime(date('Ym-d')。'+1 month')) ;' – OnethingSimple 2015-07-15 14:59:40
@Tales實際上,我猜只是'echo date('Ym-d',strtotime('+ 1 month'));'對嗎? – OnethingSimple 2015-07-15 15:15:43