2012-03-16 78 views
39

Tôi đang tìm cách tốt nhất để có được ngày đầu tiên và ngày cuối cùng của tháng trước. Tôi sử dụng chúng để tạo các truy vấn SQL để có được số liệu thống kê của tháng trước.Cách tốt nhất để có được ngày đầu tiên và cuối cùng của tháng trước?

Tôi nghĩ rằng đây là cách tốt nhất, được tối ưu hóa hơn nhưng không có nhiều hơn, ai cũng có cách khác để làm như vậy?

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

Cảm ơn !!

+0

thể trùng lặp của [PHP ngày cuối cùng của tháng] (http: // stackoverflow.com/questions/1686724/php-last-day-of-the-month) – DaveRandom

+0

bạn đã thử strtotime chưa? –

+0

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

Trả lời

95

Trong PHP 5.3, bạn có thể sử dụng lớp 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

Điều này phải là câu trả lời imho – LeonardChallis

+3

Điều này cũng hoạt động rực rỡ với 'strtotime()' nếu bạn muốn có một dấu thời gian. Giống như 'strtotime ('ngày cuối cùng của tháng trước')'. –

+0

Làm thế nào bạn sẽ làm điều này nếu bạn muốn ngày đầu tiên/ngày cuối cùng của tháng một số ngày rơi vào? – Czechnology

0

bạn có thể làm điều này trong MySQL:

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

Cảm ơn nhưng chậm hơn làm điều này trong mysql :(cảm ơn, tôi cần tối ưu hóa – aaronroman

+0

đặt một chỉ mục trên cột 'DateAndTime'. nói rằng bạn sẽ không nhận được bất kỳ nhanh hơn đó – Bazzz

3

Nếu bạn đang làm điều này với mục đích của một truy vấn MySQL, có bạn xem bằng cách sử dụng MONTH function, ví dụ

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

Điều này sẽ nhận được số liệu thống kê của bạn cho tháng 12. Nếu bạn bắt đầu gặp phải sự cố về hiệu suất và dữ liệu lịch sử không thay đổi, bạn có thể muốn biến đổi dữ liệu thành bảng tổng hợp (được cuộn lên theo mức tăng nhỏ nhất bạn cần, ví dụ: hàng ngày/hàng giờ/hàng tháng, v.v.).

+0

và những gì nếu có hàng từ tháng 12 năm 2010 và từ tháng 12 năm 2011? Làm thế nào để bạn phân biệt chúng? – Bazzz

+0

@Bazzz Doh! Tốt tại chỗ, đã thêm bộ lọc YEAR tương đương với nó (mặc dù nếu bạn theo các liên kết tôi cung cấp này nên đã được khá rõ ràng!) – liquorvicar

55

Ngày cuối cùng của tháng trước:

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

Ngày đầu tiên của tháng trước:

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

Câu trả lời hay; nếu tháng hiện tại là 01 (tháng 1) ngày() sẽ giảm một năm và quấn tháng trở lại thành 12, hoạt động tốt. Cảm ơn! – jwbensley

+0

Điều này đã giúp rất nhiều, tuy nhiên không có lời giải thích hoặc liên kết để giải thích tại sao nó hoạt động. I E. 0 trong câu lệnh đầu tiên là ngày cuối cùng bởi vì ... (0 effectivly có nghĩa là -1 vì không có 0 ngày trong bất kỳ tháng nào và PHP lấy nó là 1 - 1) – Tarquin

-1

cho phép mysql xử lý các ngày tháng.

mọi thứ dành cho cơ sở dữ liệu để thực hiện, hãy để nó hoạt động.

như thế này:

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

tốt nhất là điều này sẽ làm việc ngay cả khi những thay đổi trong năm.

chỉ cần nhớ thay đổi múi giờ cơ sở dữ liệu để khớp với php.

3

tôi sử dụng những trong MySQL và PHP script, ngắn gọn và đơn giản:

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

MySQL sử dụng ví dụ:

$query = $db->query("SELECT * FROM mytable WHERE 1 AND mydate >= '".date('Y-m-d', strtotime('first day of last month'))."'"); 
Các vấn đề liên quan