2012-03-28 21 views
8

Quindi ecco la situazione. Nella mia tabella db ho una colonna chiamata expire_date, dove metto una certa data per ogni riga. Quindi per esempio la data di scadenza è 28-04-2012php get date -1 month

Ho bisogno di un codice php che invierà a un determinato utente un avviso via e-mail che la determinata cosa che scade in quella data è di 1 mese dalla scadenza. Quindi se oggi è il 28-03-2012, ciò significa che c'è solo 1 moonth prima che la cosa scada. Non ho fatto alcun codice per questo perché non so come risolvere il mese -1.

risposta

13

prima ottenere il data in un mese con PHP:

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

Poi si può fare una select:

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

E lì c'è un array con tutti gli articoli che scadono in meno di un mese. Se si vuole esattamente quelli che scadono in 1 mese:

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

Spero che questo aiuta

+0

grazie. Ho funzionato! – gogu

+1

@La realtà dovrebbe essere in grado di ottenere la stessa data utilizzando 1 funzione meno date() come: 'date ('Ym-d', strtotime (date ('Ym-d'). '+1 month')) ; ' – OnethingSimple

+1

@Tales In realtà, immagino solo' echo date ('Ym-d', strtotime ('+ 1 month')); giusto? – OnethingSimple

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

Si noti che io uso = e non meno di, perché se lo si confronta solo che è meno di un mese, allora si sarà emailing gli utenti ogni giorno durante il mese scorso .

+0

Questo seleziona i record scaduti un mese fa. –

0

Probabilmente avrete bisogno di trasformare la vostra stringa di data in unix time e quindi fare un selectiff selezionato. (Suppongo tu stia usando sql).

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

Evitare di utilizzare le funzioni nei campi che si sta tentando di filtrare poiché rende inutilizzabili gli indici. – nnichols

1

Si può fare uso della funzione ADDDATE() nel MySQL Query.

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

Maggiori informazioni here.

Se si dispone di un indice sulla colonna expire_date, questo può essere fatto abbastanza veloce se si esegue una query per le voci con un WHERE dichiarazione come:

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

(più su CURDATE() destra here)

Se lo fai ogni giorno esattamente una volta selezionerà tutte le persone al massimo una volta e non invierà loro l'e-mail due volte poiché seleziona solo quelle che sono esattamente ad 1 mese di distanza dalla loro data di scadenza.

Ovviamente questo funziona senza alcuna attenzione circa la rappresentazione specifica delle date se si utilizza un campo tipo campo nella tabella MySQL.

3

Forse dovresti farlo in SQL piuttosto che in PHP no?

Se si vuole fare in in PHP, ecco un modo più pulito rispetto @Expert vuole essere

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

Per l'SQL è possibile utilizzare la seguente query

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

Dovresti sempre evitare di farlo in questo modo. L'uso di 'DATE_FORMAT()' nel campo DATE/DATETIME da filtrare renderà inutile qualsiasi indice. – nnichols

2

Come sottolineato da @Mikhail si dovrebbe usare = in modo che si recupera solo il record volta. Se non si desidera essere spamming gli utenti di tutti i giorni per tutto il mese in corso fino al EXPIRE_DATE -

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

Se l'EXPIRE_DATE contiene un DATETIME al contrario di un valore di data si dovrebbe usare qualcosa di simile -

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

Semplicemente;

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