Chọn mySQL chỉ dựa trên tháng và năm


102

Tôi có một cột trong MySQL DB của mình có một số hàng. Một trong những hàng này là DATE, như sau:2012-02-01

Những gì tôi muốn đạt được là thực hiện một lệnh CHỌN với PHP chỉ dựa trên năm và tháng.

Logic của SELECT sẽ như sau:

$q="SELECT * FROM projects WHERE Date="SELECT HERE THE SPECIFIC YEAR AND MONTH"";

Tháng và năm cụ thể sẽ được chuyển từ một $_POSTbiến, như thế này$_POST['period']="2012-02";

Tôi làm nó như thế nào?


2
Bạn có thể sử dụng câu lệnh GIỮA
Ben Carey

Câu trả lời:


208
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5

5
Truy vấn của bạn sẽ không mở rộng quy mô bởi vì nó cần thực hiện quét toàn bộ bảng trừ khi có một số tối ưu hóa trong MySQL mà tôi không biết.
aefxx

2
Điều này có đúng với EXTRACT(YEAR_MONTH FROM Date)?
cmbuckley

19

Nếu bạn có

$_POST['period'] = "2012-02";

Trước tiên, hãy tìm ngày đầu tiên của tháng:

$first_day = $_POST['period'] . "-01"

Sau đó, truy vấn này sẽ sử dụng một chỉ mục trên Datenếu bạn có:

$q = "
    SELECT *  
    FROM projects 
    WHERE Date BETWEEN '$first_day' 
                   AND LAST_DAY( '$first_day' )
     " ;

Người ta cũng có thể sử dụng các khoảng không bao gồm dành riêng, hoạt động khá tốt (bạn không phải lo lắng nếu cột có DATE, DATETIMEhoặc TIMESTAMPcũng như về độ chính xác:

$q = "
    SELECT *  
    FROM projects 
    WHERE Date >= '$first_day' 
      AND Date  < '$first_day' + INTERVAL 1 MONTH 
     " ;

Cảnh báo an ninh:

Bạn nên thoát đúng các giá trị này hoặc sử dụng các câu lệnh đã chuẩn bị. Tóm lại, hãy sử dụng bất kỳ phương pháp nào được khuyến nghị ngày nay trong PHP, để tránh bất kỳ sự cố chèn SQL nào.


2
Vâng, +1 cho giữa, ban đầu tôi đang sử dụng các hàm Năm + Tháng, nhưng hàm này không chia tỷ lệ, cũng không sử dụng chỉ mục.
sobelito

@sobelito Vâng. Tôi thường thích các khoảng thời gian bao gồm độc quyền. Đã cập nhật bài đăng.
ypercubeᵀᴹ

Vui lòng thoát khỏi các giá trị này hoặc sử dụng các báo cáo đã chuẩn bị sẵn ... 😓
Jared

9

Của bạn đây. Để lại máy tính cho PHP và lưu DB của bạn một số công việc. Bằng cách này, bạn có thể sử dụng hiệu quả một chỉ mục trên Datecột.

<?php
    $date = $_POST['period'];

    $start = strtotime($date);
    $end   = strtotime($date . ' 1 month - 1 second');

    $query = sprintf(
        'SELECT *
           FROM projects
          WHERE Date BETWEEN FROM_UNIXTIME(%u) AND FROM_UNIXTIME(%u)',
        $start,
        $end
    );

CHỈNH SỬA
Quên chuyển đổi dấu thời gian Unix.


Nó thân thiện với chỉ mục, nhưng strtotime cung cấp cho bạn int và trước tiên bạn cần chuyển nó thành ngày tháng cho mysql.
piotrm

Nó phải là chuỗi nối, chứ không phải là hoạt động tổng hợp:$end = strtotime($date .' 1 month - 1 second');
Konstantin Pereiaslov

6
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;

6

Giả sử bạn có một trường cơ sở dữ liệu create_at Nơi bạn lấy giá trị từ dấu thời gian. Bạn muốn tìm kiếm theo Năm & Tháng từ ngày create_at.

YEAR(date(created_at))=2019 AND MONTH(date(created_at))=2

3

Tại đây, TÌM bản ghi theo MONTH và DATE trong mySQL

Đây là giá trị POST của bạn $_POST['period']="2012-02";

Chỉ, bùng nổ giá trị bằng dấu gạch ngang $Period = explode('-',$_POST['period']);

Nhận mảng từ giá trị bùng nổ:

Array ( [0] => 2012 [1] => 02 )

Đặt giá trị trong Truy vấn SQL:

SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';

Nhận kết quả theo THÁNG và NĂM.


2

để nhận giá trị tháng và năm từ cột ngày

select year(Date) as "year", month(Date) as "month" from Projects

2

Bạn có thể làm như sau:

$q="SELECT * FROM projects WHERE Year(Date) = '$year' and Month(Date) = '$month'";

1
Điều này cũng không sử dụng một chỉ số
Thijs Riezebeek

1

Logic sẽ là:

SELECT * FROM objects WHERE Date LIKE '$_POST[period]-%';

Nhà LIKEđiều hành sẽ chọn tất cả các hàng bắt đầu $_POST['period']bằng dấu gạch ngang và ngày của tháng

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - Một số thông tin bổ sung


4
-1 Chuỗi hoạt động trên dữ liệu được biểu diễn bên trong dưới dạng số nguyên !? Bạn chắc chứ?
aefxx

@Yaroslav Vâng, hiệu quả cao, tôi giả sử: D
aefxx

2
Không có chỉ mục. Đầu tiên nó chuyển đổi giá trị ngày thành chuỗi và so khớp với chuỗi đó. Trong MySQL, bất kỳ loại cột nào cũng có thể được truy vấn bằng LIKE. Nhưng nó vẫn sẽ làm việc: D
Yaroslav

2
Bàn bobby nhỏ có ai không?
Rob

Không cần phải điên cuồng với hiệu suất mọi lúc, bây giờ làm bạn. Đôi khi nỗ lực và thời gian bạn bỏ ra để làm cho nó hoạt động nhanh hơn vài micro giây không tạo ra sự khác biệt nào, nhưng bạn đã mất thời gian đó.
Hristo Petev

0

Đây là một truy vấn mà tôi sử dụng và nó sẽ trả về mỗi bản ghi trong một khoảng thời gian dưới dạng tổng.

Đây là mã:

$result = mysqli_query($conn,"SELECT emp_nr, SUM(az) 
FROM az_konto 
WHERE date BETWEEN '2018-01-01 00:00:00' AND '2018-01-31 23:59:59' 
GROUP BY emp_nr ASC");

echo "<table border='1'>
<tr>
<th>Mitarbeiter NR</th>
<th>Stunden im Monat</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
$emp_nr=$row['emp_nr'];
$az=$row['SUM(az)'];
echo "<tr>";
echo "<td>" . $emp_nr . "</td>";
echo "<td>" . $az . "</td>";
echo "</tr>";
}
echo "</table>";
$conn->close();
?>

Điều này liệt kê từng emp_nr và tổng số giờ hàng tháng mà họ đã tích lũy.


0

bạn có thể làm điều đó bằng cách thay đổi $ q thành sau:

$q="SELECT * FROM projects WHERE YEAR(date) = $year_v AND MONTH(date) = $month_v;

-1

Vâng, điều này đang hoạt động, nhưng nó chỉ trả về một hàng trong khi có một số hàng để truy xuất chỉ bằng cách sử dụng các cột đã chọn. Giống như SELECT Title, Date FROM mytable WHERE YEAR (Ngày) = 2017 AND MONTH (Date) = 09 chỉ trả về một hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.