web-dev-qa-db-fra.com

Sélectionnez MySQL uniquement en fonction du mois et de l'année

J'ai une colonne dans ma base de données mySQL qui a quelques lignes. Une de cette ligne est une date, comme ceci: 2012-02-01

Ce que je veux réaliser est de faire un SELECT avec PHP basé uniquement sur l'année et le mois.

La logique du SELECT sera la suivante:

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

Le mois et l'année spécifiques seront passés d'une variable $_POST, comme ceci $_POST['period']="2012-02";

Comment puis-je le faire?

78
DiegoP.
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5
173
Rick Kuipers

Si tu as 

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

Premièrement, trouvez le premier jour du mois:

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

Ensuite, cette requête utilisera un index sur Date si vous en avez un:

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

Vous pouvez également utiliser des intervalles inclusifs-exclusifs, qui fonctionnent assez bien (vous n'avez pas à vous inquiéter si la colonne est DATE, DATETIME ou TIMESTAMP, ni à propos de la précision:

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

Avertissement de sécurité:

Vous devez correctement échapper à ces valeurs ou utiliser des instructions préparées. En bref, utilisez la méthode recommandée en PHP pour éviter tout problème d'injection SQL.

18
ypercubeᵀᴹ

Voici. Laissez l’informatique à PHP et sauvegardez votre base de données. De cette façon, vous pouvez utiliser efficacement un index dans la colonne Date.

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

MODIFIER
Oublié la conversion d’horodatage Unix.

8
aefxx
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;
5
Arjan

Supposons que vous ayez un champ de base de données created_at Où vous prenez la valeur de timestamp . Vous souhaitez effectuer une recherche par année et par mois à partir de created_at date.

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

Vous pouvez faire comme ça:

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

La logique sera:

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

L’opérateur LIKE sélectionnera toutes les lignes commençant par $_POST['period'] suivi du tiret et du jour du mois.

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - Quelques informations supplémentaires

1
Hristo Petev

pour obtenir les valeurs de mois et d'année de la colonne de date

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

Voici une requête que j’utilise et qui renverra chaque enregistrement d’une période.

Voici le code:

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

Ceci liste chaque emp_nr et la somme des heures mensuelles qu’ils ont accumulées.

0
Frank Casser