2012-03-28 17 views
8

だからここに状況があります。私のdbテーブルでは、私はexpire_dateという列を持っています。ここで、各行に特定の日付を入れます。 たとえば、有効期限は28-04-2012ですPHP取得日-1月

特定のユーザーに、その日付で有効期限が切れる特定のユーザーに有効期限が切れる1ヶ月という通知を送信するPHPコードが必要です。したがって、今日が28-03-2012であれば、そのことが期限切れになる前に月が1つしかないことを意味します。 私は-1ヶ月を解決する方法がわからないので、私はこれのためのコードを作っていませんでした。

答えて

13

ファーストを使用することができますSQLの場合

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

ありがとう。それは働いた! – gogu

+1

@ date( 'Ym-d'、strtotime(date( 'Ym-d')。 '+1 month'))のように、より少ないdate()関数を使って同じ日付を得ることができるはずです。 ; ' – OnethingSimple

+1

@テール実際は、エコーの日付(' Ym-d '、strtotime(' + 1 month ')); – OnethingSimple

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

あなたはちょうどそれは、あなたが先月中に、毎日のユーザーに電子メールで送信されます、未満1ヶ月だと比較した場合ので、私は、=なく未満を使用お知らせ。

+0

これは、1か月前に期限切れになったレコードを選択します。 –

0

おそらく、日付文字列をUNIX時間に変換してから、select datediffを実行する必要があります。 (私はあなたがSQLを使用していると仮定します)。

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

インデックスを使用できないようにレンダリングするため、フィルタリングしようとしているフィールドで関数を使用しないでください。 – nnichols

1

あなたはMySQLのクエリでADDDATE()機能を利用することができます。

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

詳細here

あなたexpire_date列に索引を持っている場合は、のようなWHERE文を使用して、エントリを照会する場合、これは非常に高速に行うことができます。

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

(右hereCURDATE()の詳細)

の場合あなたは毎日正確に1回それはそれが有効期限からちょうど1ヶ月離れているものを選択するので、最大で一度すべての人を選択し、それらを2回電子メールを送信しません。もちろん

あなたはMySQLのテーブルにDATEのFIELDTYPEを使用する場合は、この日付の特定の表現に関する追加のケアなしで動作します。

3

PHPではなくSQLでこれを行うべきでしょうか?

あなたがPHPでで行いたい場合は、ここで@Expertよりきれいな方法は、あなたが得る次のクエリ

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

になりたいですPHPでの1月の日付:

$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

このようにしないでください。フィルターをかけたいDATE/DATETIMEフィールドで 'DATE_FORMAT()'を使うと、インデックスが無駄になります。ありがとう。 – nnichols

2

としてはあなたが一度だけのレコードを取得するよう=を使用する必要があります@Mikhailによって指摘役に立てば幸い: あなたは1ヶ月で期限切れに正確なものにしたい場合。あなたはEXPIRE_DATEまで実行されている月の全体のために日常的にユーザーをスパムしたくない -

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

あなたがのようなものを使用する必要がありDATE値とは対照的に、あなたのEXPIRE_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 
関連する問題