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.