2012-03-16 6 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

、あなたは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 

これは12月の統計情報を取得します。パフォーマンスの問題が発生し、履歴データが変更されない場合は、データを集計テーブルに非正規化する必要があります(たとえば、毎日/毎時/毎月など、必要最小限の増分でロールアップします)。前月の

+0

と、2010年12月から2011年12月までの行がある場合はどうすればいいですか?どのように区別しますか? – Bazzz

+0

@Bazzz Doh!これに相当するYEARフィルターが追加されました。あなたがリンクをたどった場合、これはかなり明白であったはずです!) – liquorvicar

55

最終日:前月の

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

初日:PHP 5.3で

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

ニースの答え;現在の月が01(1月)の場合、date()は年を1つ減らして12に戻します。ありがとう! – jwbensley

+0

これは大きな助けになりましたが、それがうまくいった理由の説明や説明へのリンクはありません。すなわち、最初のステートメントの0は最後の日です...(0は効果的に-1を意味します。なぜなら、PHPは1日に0日がないからです。) – 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に合うようにデータベースのタイムゾーンを変更することを忘れないでください。

私は短く、シンプル、MySQLとPHPスクリプトでこれらを使用
3

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