it-swarm.com.de

Wählen Sie mySQL nur nach Monat und Jahr aus

Ich habe eine Spalte in meiner mySQL-Datenbank, die einige Zeilen enthält. Eine dieser Zeilen ist ein DATUM, wie folgt: 2012-02-01

Was ich erreichen möchte, ist ein SELECT mit PHP, das nur auf Jahr und Monat basiert.

Die Logik der SELECT-Anweisung lautet wie folgt:

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

Der spezifische Monat und das Jahr werden von einer $_POST-Variablen wie dieser $_POST['period']="2012-02"; übergeben.

Wie kann ich es tun?

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

Wenn Sie haben 

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

Suchen Sie zuerst den ersten Tag des Monats:

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

Dann verwendet diese Abfrage einen Index für Date, falls Sie einen haben:

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

Man könnte auch Inklusiv-Exklusiv-Intervalle verwenden, die ziemlich gut funktionieren (Sie müssen sich keine Sorgen machen, ob die Spalte DATE, DATETIME oder TIMESTAMP ist) oder sich um die Genauigkeit kümmern

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

Sicherheitswarnung:

Sie sollten diesen Werten ordnungsgemäß entgehen oder vorbereitete Anweisungen verwenden. Kurz gesagt, verwenden Sie die in PHP heutzutage empfohlene Methode, um Probleme mit der SQL-Injection zu vermeiden.

18
ypercubeᵀᴹ

Bitte schön. Überlassen Sie das Computing dem PHP und speichern Sie Ihrer Datenbank etwas Arbeit. Auf diese Weise können Sie einen Index in der Spalte Date effektiv verwenden.

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

EDIT
Unix-Zeitstempel-Konvertierung vergessen.

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

Angenommen, Sie verfügen über ein Datenbankfeld, create_at. Wo Sie den Wert vom Zeitstempel verwenden.

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

Das kannst du so machen:

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

Hier FINDEN Sie eine Aufzeichnung nach MONAT und DATUM in mySQL

Hier ist Ihr POST Wert $_POST['period']="2012-02";

Explodieren Sie einfach den Wert mit dem Bindestrich $Period = explode('-',$_POST['period']);

Array aus Explosionswert holen:

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

Wert in SQL-Abfrage einfügen:

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

Erhalten Sie das Ergebnis nach MONAT und JAHR.

2
chintan mahant

Die Logik wird sein:

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

Der Operator LIKE wählt alle Zeilen aus, die mit $_POST['period'] beginnen, gefolgt von einem Bindestrich und dem Tag des Monats

http://dev.mysql.com/doc/refman/5.0/de/pattern-matching.html - Einige zusätzliche Informationen

1
Hristo Petev

um die Werte für Monat und Jahr aus der Datumsspalte zu erhalten

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

Hier ist eine Abfrage, die ich verwende, und jeder Datensatz wird innerhalb einer Periode als Summe zurückgegeben.

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

Dies listet jede emp_nr und die Summe der monatlichen Stunden auf, die sie gesammelt haben.

0
Frank Casser