119 votes

Sélection de mySQL basée uniquement sur le mois et l'année

J'ai une colonne dans ma base de données MySQL qui contient quelques lignes. L'une de ces lignes est une DATE, comme ceci : 2012-02-01

Ce que je veux réaliser, c'est 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 transmis à partir d'un fichier de type $_POST comme ceci $_POST['period']="2012-02";

Comment puis-je le faire ?

2 votes

Vous pouvez utiliser l'instruction BETWEEN

1voto

PAULDAWG Points 508

Pour obtenir les valeurs du mois et de l'année de la colonne de date

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

1voto

Symon265 Points 1

Vous pouvez le faire en remplaçant $q par ceci :

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

1voto

VeeK Points 624

Personne ne semble parler de performances. J'ai donc testé les deux réponses les plus populaires sur un banc d'essai. exemple de base de données à partir de Mysql . Le tableau comporte 2.8M de lignes avec une structure

CREATE TABLE `salaries` (
  `emp_no` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  `from_date` date NOT NULL,
  `to_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `salaries`
  ADD PRIMARY KEY (`emp_no`,`from_date`);

Voici les tests effectués et les résultats

SELECT * FROM `salaries` WHERE YEAR(from_date) = 1992 AND MONTH(from_date) = 6
12339 results
-----------------
11.5 ms 
12.1 ms
09.5 ms
07.5 ms
10.2 ms
-----------------
10.2 ms Avg
-----------------

SELECT * FROM `salaries` WHERE from_date BETWEEN '1992-06-01' AND '1992-06-31'
-----------------
10.0 ms
10.8 ms
09.5 ms
09.0 ms
08.3 ms
-----------------
09.5 ms Avg
-----------------

SELECT * FROM `salaries` WHERE YEAR(to_date) = 1992 AND MONTH(to_date) = 6
10887 results
-----------------
10.2 ms
11.7 ms
11.8 ms
12.4 ms
09.6 ms
-----------------
11.1 ms Avg
-----------------

SELECT * FROM `salaries` WHERE to_date BETWEEN '1992-06-01' AND '1992-06-31'
-----------------
09.0 ms
07.5 ms
10.6 ms
11.7 ms
12.0 ms
-----------------
10.2 ms Avg
-----------------

Mes conclusions

  1. BETWEEN était légèrement meilleur sur la colonne indexée et non indexée.
  2. La colonne non indexée était marginalement plus lente que la colonne indexée.

0voto

Frank Casser Points 9

Voici une requête que j'utilise et qui renvoie chaque enregistrement d'une période sous forme de somme.

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

Cette liste énumère chaque emp_nr et la somme des heures mensuelles qu'il a accumulées.

-2voto

BLOGBIR Points 69

Oui, cela fonctionne, mais cela renvoie une seule ligne alors qu'il y a plusieurs lignes à récupérer en utilisant uniquement les colonnes sélectionnées. Comme SELECT Title,Date FROM mytable WHERE YEAR(Date)=2017 AND MONTH(Date)=09 ne renvoie qu'une seule ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X