Felix Riesterer: Mysql: Tage zwischen 2 Datumsangaben auflisten

Beitrag lesen

Lieber juppix,

  1. erst einmal zwischen 2 Daten (bei mir 1 Jahr) alle möglichen Datumswerte auflisten lassen.

Das bedeutet ein SELECT, bei dem Du das Datum mit Grenzwerten definierst:

SELECT *
FROM `items`
WHERE `Tag` >= '2018-01-01 00:00:00'
AND `Tag` <= '2018-12-31 23:59:59';

Das geht auch mit BETWEEN:

SELECT *
FROM `items`
WHERE `Tag` BETWEEN '2018-01-01 00:00:00' AND '2018-12-31 23:59:59';

und 2. diese dann noch mit der SUMME aller Termine (wenn überhaupt vorhanden am entsprechenden Tag) darstellen lassen.

Dazu kenne ich keine Lösung. Für alle items im oben definierten Zeitraum kannst Du ja COUNT() einsetzen, um die Gesamtanzahl zu ermitteln. Das ganze jedoch nach Tagen gezählt... hmm.

Tag | Summe
----------------------------
2018-01-01 | 0
2018-01-02 | 0
2018-01-03 | 02018-05-18 | 22018-12-30 | 0
2018-12-31 | 0

Das bedeutet, dass Du auch für Nicht-Treffer einen Eintrag möchtest. Diese müsste die Abfrage erst erzeugen. Warum soll das schon in der Datenbank geschehen? Wäre es für Dich nicht schneller und verständlicher erreichbar, das mit PHP zu lösen?

$items = array(
  '2018-01-01' => 0,
  '2018-01-02' => 0,
  '2018-01-03' => 0,
...
  '2018-05-18' => 2,
...
);

Du kannst ja meine obige SQL-Abfrage verwenden, um darüber zu iterieren und für jedes gefundene Datum den Wert im passenden Array-Index um eins erhöhen.

$db_data = array(
  0 => array(
    'id' => 0,
    'Tag' => '2018-05-18 10:10:00',
    'Text' => 'Testtermin'
  ),
  1 => array(
    'id' => 1,
    'Tag' => '2018-05-18 22:19:40',
    'Text' => 'Testtermin2'
  ),
  2 => array(
    'id' => 2,
    'Tag' => '2019-02-19 01:08:10',
    'Text' => 'Testxyz'
  )
);

$day = '2018-01-01';
$end = '2019-01-01';
$items = array();

while ($day != $end) {

  // UNIX timestamp for $day
  $time = strtotime($day);

  // create array key with counter at zero
  $items[$day] = 0;

  // find suitable item from DB
  foreach ($db_data as $item) {
    // item for this day?
    if ($day == date('Y-m-d', strtotime($item['Tag']))) {
      // increment counter by one
      $items[$day]++;
    }
  }

  // go to next day
  $day = date('Y-m-d', strtotime('+1 day', $time));
}

Ich habe das jetzt nicht getestet, aber $items sollte in etwa Deine gewünschte Tabelle ausgeben.

Liebe Grüße,

Felix Riesterer.