2012-03-16 17 views
39

Sto cercando il modo migliore per ottenere il primo e l'ultimo giorno di un mese. Li uso per creare query SQL per ottenere statistiche del mese scorso.Il modo migliore per ottenere il primo e l'ultimo giorno del mese scorso?

Penso che questo sia il modo migliore, più ottimizzato ma non più completo, qualcuno ha un altro modo di fare lo stesso?

$month_ini = date("Y-m-d", mktime(0, 0, 0, date("m", strtotime("-1 month")), 1, date("Y", strtotime("-1 month")))); 

    $month_end = date("Y-m-d", mktime(0, 0, 0, date("m", strtotime("-1 month")), date("t", strtotime("-1 month")), date("Y", strtotime("-1 month")))); 

Grazie !!

+0

possibile duplicato del [PHP ultimo giorno del mese] (http: // stackoverflow.com/questions/1686724/php-last-day-of-the-month) – DaveRandom

+0

hai provato strtotime? –

+0

http://stackoverflow.com/questions/2680501/how-can-i-find-the-first-and-last-date-in-a-month-using-php –

risposta

95

In PHP 5.3, è possibile utilizzare la classe DateTime:

<?php 

$month_ini = new DateTime("first day of last month"); 
$month_end = new DateTime("last day of last month"); 

echo $month_ini->format('Y-m-d'); // 2012-02-01 
echo $month_end->format('Y-m-d'); // 2012-02-29 
+1

Questa dovrebbe essere la risposta imho – LeonardChallis

+3

Anche questo funziona brillantemente con 'strtotime()' se vuoi un timestamp. Come 'strtotime ('ultimo giorno del mese scorso')'. –

+0

Come lo faresti se volessi il primo/ultimo giorno del mese in cui cade qualche data? – Czechnology

0

si può fare questo in MySQL:

WHERE `DateAndTime` >= '2012-02-01 00:00:00' 
AND `DateAndTime` < '2012-03-01 00:00:00' 
+0

Grazie ma è più lento farlo in mysql :(grazie, ho bisogno di ottimizzazione – aaronroman

+0

mettere un indice sulla colonna 'DateAndTime'. – Bazzz

3

Se stai facendo questo con lo scopo di una query MySQL, avete considerato utilizzando il MONTH function, per esempio

SELECT [whatever stats you're after] FROM table 
WHERE MONTH(date_field) = 12 and YEAR(date_field) = 2011 

Questo otterrà le statistiche per dicembre. Se si verificano problemi di prestazioni e i dati storici non cambiano, è possibile denormalizzare i dati in una tabella aggregata (arrotolata con l'incremento minimo necessario, ad esempio ogni giorno/ogni ora/mese, ecc.).

+0

e cosa succede se ci sono file da dicembre 2010 e da dicembre 2011? Come li distingui? – Bazzz

+0

@Bazzz Doh! Buon posto, hai aggiunto il filtro ANNO equivalente ad esso (anche se se hai seguito il link che ho fornito questo dovrebbe essere abbastanza ovvio!) – liquorvicar

55

ultimo giorno del mese precedente:

date("Y-m-d", mktime(0, 0, 0, date("m"), 0)); 

primo giorno del mese precedente:

date("Y-m-d", mktime(0, 0, 0, date("m")-1, 1)); 
+3

Risposta piacevole; se il mese corrente è 01 (gennaio) la data() diminuirà l'anno di uno e avvolgerà il mese intorno al 12, funziona alla grande. Grazie! – jwbensley

+0

Ciò ha aiutato molto, tuttavia non vi è alcuna spiegazione o collegamento alla spiegazione di PERCHÉ ha funzionato. vale a dire. lo 0 nella prima affermazione è l'ultimo giorno perché ... (0 efficacemente significa -1 poiché non c'è 0 giorno in nessun mese e PHP lo prende come 1 - 1) – Tarquin

-1

lascia che mysql si occupi delle date.

tutto ciò che deve fare il database, lasciarlo fare.

come questo:

mysql_query("set @last_day=last_day(now()-interval 1 month),@first_day=(@last_day-interval 1 month)+interval 1 day"); 
$result=mysql_query("select * from `table` where (`date` between @first_day and @last_day)"); 

la migliore è che questo funzionerà anche se l'anno cambia.

Ricordarsi di cambiare il fuso orario del database in modo che corrisponda a php.

3

io uso questi in MySQL e PHP script, brevi e semplici:

echo date('Y-m-d', strtotime('first day of last month')); 
echo date('Y-m-d', strtotime('last day of last month')); 

MySQL utilizzare ad esempio:

$query = $db->query("SELECT * FROM mytable WHERE 1 AND mydate >= '".date('Y-m-d', strtotime('first day of last month'))."'"); 
Problemi correlati