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?
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5
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.
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.
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;
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
Vous pouvez faire comme ça:
$q="SELECT * FROM projects WHERE Year(Date) = '$year' and Month(Date) = '$month'";
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
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
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.