Pilih mySQL hanya berdasarkan bulan dan tahun


102

Saya memiliki kolom di mySQL DB saya yang memiliki beberapa baris. Salah satu baris ini adalah DATE, seperti ini:2012-02-01

Apa yang ingin saya capai adalah melakukan PILIHAN dengan PHP hanya berdasarkan tahun dan bulan.

Logika SELECT adalah sebagai berikut:

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

Bulan dan tahun tertentu akan dilewatkan dari $_POSTvariabel, seperti ini$_POST['period']="2012-02";

Bagaimana saya bisa melakukannya?


2
Anda dapat menggunakan pernyataan BETWEEN
Ben Carey

Jawaban:


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

5
Kueri Anda tidak akan diskalakan karena perlu melakukan pemindaian tabel lengkap kecuali ada beberapa pengoptimalan di MySQL yang tidak saya sadari.
aefxx

2
Apakah ini benar EXTRACT(YEAR_MONTH FROM Date)?
cmbuckley

19

Jika Anda memiliki

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

Pertama, temukan hari pertama setiap bulan:

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

Kemudian kueri ini akan menggunakan indeks Datejika Anda memilikinya:

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

Seseorang juga dapat menggunakan interval inklusif-eksklusif, yang berfungsi cukup baik (Anda tidak perlu khawatir jika kolomnya DATE, DATETIMEatau TIMESTAMP, atau tentang presisi:

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

Peringatan keamanan:

Anda harus melepaskan nilai-nilai ini dengan benar atau menggunakan pernyataan yang telah disiapkan. Singkatnya, gunakan metode apa pun yang direkomendasikan hari ini di PHP, untuk menghindari masalah injeksi SQL.


2
Ya, +1 untuk antara keduanya, saya awalnya menggunakan fungsi Tahun + Bulan, tapi tidak berskala, atau menggunakan indeks.
sobelito

@obelito Ya. Saya biasanya lebih suka interval inklusif-eksklusif. Posting diperbarui.
ypercubeᵀᴹ

Harap lepas dari nilai-nilai ini atau gunakan pernyataan yang telah disiapkan ... 😓
Jared

9

Ini dia. Biarkan komputasi ke PHP dan simpan beberapa pekerjaan DB Anda. Dengan cara ini Anda dapat menggunakan indeks pada Datekolom secara efektif .

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

EDIT
Lupa konversi stempel waktu Unix.


Ini ramah indeks, tetapi strtotime memberi Anda int dan Anda perlu mengubahnya menjadi tanggal untuk mysql terlebih dahulu.
piotrm

Ini harus berupa rangkaian string, bukan operasi penjumlahan:$end = strtotime($date .' 1 month - 1 second');
Konstantin Pereiaslov

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

6

Misalkan Anda memiliki bidang database create_at Di mana Anda mengambil nilai dari timestamp. Anda ingin mencari berdasarkan Tahun & Bulan dari tanggal create_at.

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

3

Di sini, TEMUKAN catatan berdasarkan MONTH dan DATE di mySQL

Inilah nilai POST Anda $_POST['period']="2012-02";

Hanya, meledak nilai demi setrip $Period = explode('-',$_POST['period']);

Dapatkan array dari nilai ledakan:

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

Masukkan nilai dalam SQL Query:

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

Dapatkan Hasil sebelum MONTH dan YEAR.


2

untuk mendapatkan nilai bulan dan tahun dari kolom tanggal

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


1

Logikanya adalah:

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

The LIKEOperator akan memilih semua baris yang dimulai dengan$_POST['period'] diikuti oleh dasbor dan hari mont tersebut

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - Beberapa informasi tambahan


4
-1 Operasi string pada data yang secara internal direpresentasikan sebagai integer !? Kamu serius?
aefxx

@Yaroslav Ya, sangat efisien, saya kira: D
aefxx

2
Tanpa indeks. Ini pertama kali mengubah nilai tanggal menjadi string dan kemudian mencocokkan string itu. Di MySQL semua jenis kolom dapat di-query oleh LIKE. Tapi tetap saja itu akan berhasil: D
Yaroslav

2
Little bobby table siapa?
Rob

Tidak perlu tergila-gila dengan kinerja setiap saat, sekarang kan. Terkadang usaha dan waktu yang Anda berikan untuk membuatnya bekerja beberapa mikrodetik lebih cepat tidak membuat perbedaan apa pun, tetapi Anda kehilangan waktu itu.
Hristo Petev

0

Berikut adalah kueri yang saya gunakan dan itu akan mengembalikan setiap catatan dalam periode sebagai jumlah.

Ini kodenya:

$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();
?>

Ini mencantumkan setiap emp_nr dan jumlah jam bulanan yang telah mereka kumpulkan.


0

Anda dapat melakukannya dengan mengubah $ q menjadi ini:

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

-1

Ya ini berfungsi, tetapi mengembalikan satu baris saja sementara ada beberapa baris untuk diambil hanya menggunakan kolom yang dipilih. Seperti SELECT Title, Date FROM mytable WHERE YEAR (Date) = 2017 AND MONTH (Date) = 09 hanya mengembalikan satu baris.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.