MySQL'i yalnızca ay ve yıla göre seçin


102

MySQL DB'mde bazı satırları olan bir sütunum var. Bu satırlardan biri DATE, şuna benzer:2012-02-01

Başarmak istediğim şey, PHP ile yalnızca yıl ve aya bağlı olarak SELECT yapmaktır.

SELECT'in mantığı şu şekilde olacaktır:

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

Belirli bir ay ve yıl, bunun $_POSTgibi bir değişkenden geçirilecektir$_POST['period']="2012-02";

Nasıl yapabilirim?


2
BETWEEN ifadesini kullanabilirsiniz
Ben Carey

Yanıtlar:


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

5
MySQL'de farkında olmadığım bir optimizasyon olmadığı sürece tam bir tablo taraması yapması gerektiği için sorgunuz ölçeklenmeyecek.
aefxx

2
Bu doğru EXTRACT(YEAR_MONTH FROM Date)mu?
cmbuckley

19

Eğer varsa

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

İlk olarak, ayın ilk gününü bulun:

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

Daha sonra bu sorgu, Dateeğer varsa, bir dizin kullanacaktır :

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

Bir de sütun ise endişe gerekmez (tatlı iyi çalışır kapsayıcı münhasır aralıkları, kullanabilir DATE, DATETIMEya da TIMESTAMPne hassasiyetle hakkında:

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

Güvenlik uyarısı:

Bu değerlerden uygun şekilde kaçınmalı veya hazırlanmış ifadeler kullanmalısınız. Kısacası, herhangi bir SQL enjeksiyon sorununu önlemek için PHP'de bu günlerde önerilen yöntemi kullanın.


2
Evet, ara için +1, başlangıçta Yıl + Ay işlevlerini kullanıyordum, ancak bu ölçeklenmedi ve dizin kullanmadı.
sobelito

@sobelito Evet. Genelde kapsayıcı-özel aralıkları tercih ederim. Gönderi güncellendi.
ypercubeᵀᴹ

Lütfen bu değerlerden kaçının veya hazırlanmış ifadeleri kullanın ... 😓
Jared

9

Hadi bakalım. Bilgisayarı PHP'ye bırakın ve DB'nizi biraz çalışın. Bu şekilde, Datesütundaki bir dizinden etkili bir şekilde yararlanabilirsiniz .

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

DÜZENLE
Unix zaman damgası dönüşümünü unuttum.


Dizin dostudur, ancak strtotime size int verir ve önce mysql için bunu tarihe dönüştürmeniz gerekir.
piotrm

Toplam işlemden ziyade dizgi birleştirme olmalıdır:$end = strtotime($date .' 1 month - 1 second');
Konstantin Pereiaslov

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

6

Zaman damgasından değer aldığınız yerde created_at bir veritabanı alanınız olduğunu varsayalım. Oluşturulma tarihinden itibaren Yıl ve Ay'a göre arama yapmak istiyorsunuz.

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

3

Burada, mySQL'de MONTH ve DATE tarihine kadar kayıt BUL

İşte POST değeriniz $_POST['period']="2012-02";

Sadece, değeri kısa çizgi ile patlat $Period = explode('-',$_POST['period']);

Patlama değerinden dizi alın:

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

SQL Sorgusuna değer koyun:

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

AY ve YIL bazında Sonucu alın.


2

tarih sütunundan ay ve yıl değerlerini almak için

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


1

Mantık şöyle olacaktır:

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

LIKEOperatör ile başlayan tüm satırları seçecektir $_POST['period']çizgi izledi ve mont gününü

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - Bazı ek bilgiler


4
-1 Dahili olarak bir tamsayı olarak temsil edilen veriler üzerinde dize işlemleri !? Ciddi misin?
aefxx

@Yaroslav Evet, oldukça verimli, sanırım: D
aefxx

2
Endeks olmadan. Önce tarih değerini dizeye dönüştürür ve ardından bu dizeyle eşleşir. MySQL'de herhangi bir sütun türü LIKE ile sorgulanabilir. Ama yine de işe yarayacak: D
Yaroslav

2
Küçük bobby tabloları var mı?
Rob

Her zaman performans için deli olmaya gerek yok, şimdi öyle. Bazen bir şeyin birkaç mikrosaniye daha hızlı çalışmasını sağlamak için harcadığınız çaba ve zaman bir fark yaratmaz, ancak o zamanı kaybettiniz.
Hristo Petev

0

İşte kullandığım bir sorgu ve her kaydı bir dönem içinde toplam olarak döndürecektir.

İşte kod:

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

Bu, her emp_nr'yi ve biriktirdikleri aylık saatlerin toplamını listeler.


0

$ q 'yu şuna değiştirerek bunu yapabilirsiniz:

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

-1

Evet bu çalışıyor, ancak yalnızca seçili sütunlar kullanılarak alınacak birkaç satır varken yalnızca bir satır döndürür. SELECT Title, Date from mytable NEREDE YEAR (Tarih) = 2017 VE MONTH (Tarih) = 09 yalnızca bir satır döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.