2012-03-16 2 views
39

Я ищу лучший способ получить первый и последний день прошлого месяца. Я использую их для получения SQL-запросов для получения статистики за последний месяц.Лучший способ получить первый и последний день прошлого месяца?

Я думаю, что это лучший способ, более оптимизированный, но не более всеобъемлющий, у кого есть другой способ сделать то же самое?

$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")))); 

Спасибо!

+0

возможно дубликат [PHP последний день месяца] (Http: // stackoverflow.com/questions/1686724/php-last-day-of-the-month) – DaveRandom

+0

Вы пробовали strtotime? –

+0

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

ответ

95

В PHP 5.3, вы можете использовать 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

Это должно быть ответом imho – LeonardChallis

+3

Это также блестяще работает с 'strtotime()', если вы хотите создать временную метку. Как 'strtotime ('последний день прошлого месяца')'. –

+0

Как бы вы это сделали, если хотите, чтобы в первый/последний день месяца приходила какая-то дата? – Czechnology

0

вы можете сделать это в MySQL:

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

Спасибо, но медленнее сделайте это в mysql :(спасибо, мне нужна оптимизация – aaronroman

+0

введите индекс в столбец 'DateAndTime'. скажите, что вы не получите быстрее, чем это. – Bazzz

3

Если вы делаете это с целью запроса MySQL, вы рассмотрели с помощью MONTH function, например,

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

Это будет ваша статистика за декабрь. Если вы начинаете испытывать проблемы с производительностью, а исторические данные не меняются, вы можете захотеть денормализовать данные в сводную таблицу (свернутую наименьшим приращением, который вам нужен, например, ежедневно/час/месяц и т. Д.).

+0

и что, если есть строки с декабря 2010 года и с декабря 2011 года? Как вы их различаете? – Bazzz

+0

@Bazzz Doh! Хорошее место, добавили к нему эквивалентный фильтр YEAR (хотя если бы вы следовали за ссылкой, которую я предусмотрел, это должно было быть довольно очевидным!) – liquorvicar

55

Последний день предыдущего месяца:

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

Первый день предыдущего месяца:

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

Хороший ответ; если текущий месяц равен 01 (январь) date(), будет уменьшаться год на один и завернуть месяц назад до 12, отлично работает. Благодаря! – jwbensley

+0

Это очень помогло, однако нет объяснений или ссылок на объяснение ПОЧЕМУ это сработало. то есть. 0 в первом утверждении - последний день, потому что ... (0 effectivly означает -1, так как нет никакого 0-го дня в любом месяце, и PHP принимает его как 1-й - 1) – Tarquin

-1

пусть mysql справится с датами.

Что-нибудь, что нужно сделать для базы данных, пусть это сделает.

так:

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)"); 

лучшее, что это будет работать, даже если год изменения.

просто не забудьте изменить часовой пояс базы данных, чтобы соответствовать php.

3

Я использую их в MySQL и PHP скрипты, короткие и простые:

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

MySQL использовать пример:

$query = $db->query("SELECT * FROM mytable WHERE 1 AND mydate >= '".date('Y-m-d', strtotime('first day of last month'))."'"); 
Смежные вопросы