Nur Datensätze anzeigen, wenn heute zwischen zwei angegebenen Daten liegt

DerUnsympath

Mitglied
Hallo,

ich habe eine MySQL-Tabelle, mit u.a. zwei Feldern 'date_start' und 'date_end' des Typs INT, darin steht der Timestamp. Beide Felder stellen einen Datumsbereich dar, also z.B. 15.02.-05.03.

Nun möchte ich alle Datensätze auslesen, bei denen heute (also 21.02.) in diesem Datumsbereich liegt. Das Jahr spielt darin keine Rolle, da es sich um wiederkehrende Ereignisse handeln soll.

Ich habe schon vieles probiert, aber irgendwie klappt es nicht. :(
PHP:
$sql = "SELECT * FROM daten WHERE (DAY(FROM_UNIXTIME(date_start)) BETWEEN " . date('d') . " 
AND DAY(FROM_UNIXTIME(date_start)) AND MONTH(FROM_UNIXTIME(date_start)) BETWEEN " . date('m') . " 
AND MONTH(FROM_UNIXTIME(date_start))) AND (DAY(FROM_UNIXTIME(date_end)) BETWEEN " . date('d') . " 
AND DAY(FROM_UNIXTIME(date_end)) AND MONTH(FROM_UNIXTIME(date_end)) BETWEEN " . date('m') . " 
AND MONTH(FROM_UNIXTIME(date_end)))"
Würde mich daher über Hilfe freuen, oder zumindest eine Anregung.

Viele Grüße
 
Hi,

oh, ein wenig konfus, die Abfrage. Ich übersetze sie mal in Worte:

Wähle alles, wo
- der Starttag zwischen dem aktuellen und dem Starttag und
- der Startmonat zwischen dem aktuellen und dem Startmonat und
- der Endtag zwischen dem aktuellen und dem Endtag und
- der Endmonat zwischen dem aktuellen und dem Endmonat
liegt. ;)

Wenn ich Dich richtig verstehe, möchtest Du aber folgendes:

Wähle alles, wo
- der aktuelle Tag zwischen dem Starttag und dem Endtag und
- der aktuelle Monat zwischen dem Startmonat und dem Endmonat
liegt.

LG
 
Hallo 'Der mit dem komischen Namen'. :)

Wähle alles, wo
- der aktuelle Tag zwischen dem Starttag und dem Endtag und
- der aktuelle Monat zwischen dem Startmonat und dem Endmonat
liegt.
Irgendwie ist das das Problem. Denn 'der aktuelle Tag zwischen dem Starttag und dem Endtag' ist so auch nicht immer korrekt.

Denn wenn das Startdatum der 31.12. ist und das Enddatum der 27.02., läge der heutige Tag (also der 21.) ja nicht in dieser Range, allerdings aber in der Gesamtheit (den Monat berücksichtigend). Da hilft auch kein BETWEEN, oder?
 
Zuletzt bearbeitet:
Hallo 'der mit dem sympathischen Namen',

das stimmt. Mit den Tagen hast Du monatsübergreifend das gleiche Problem. Du kommst hier mit BETWEEN nicht weiter.

Da die Bedingungen voneinander abhängen, wird das etwas komplexer werden.
Wenn Du mir einen Testdump zur Verfügung stellst, probier ich da nachher mal mit rum. :D

LG
 
Hui, das wäre aber nett von dir. :)

Hier der Dump:
PHP:
CREATE TABLE IF NOT EXISTS `daten` (
  `id` int(3) unsigned NOT NULL,
  `title` text NOT NULL,
  `date_start` int(11) NOT NULL,
  `date_end` int(11) NOT NULL,
  `type` int(1) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

INSERT INTO `daten` (`id`, `title`, `date_start`, `date_end`, `type`, `content`) VALUES
(1, 'Silvester', 1262217600, 1262217600, 0, 'Alles Güte!'),
(4, 'Weihnachten', 1261612800, 1261785600, 0, 'Merry X-Mas!'),
(5, 'Ostern', 1234310400, 1235692800, 0, 'Ostereier!'),
(6, 'Test', 1262131200, 1235692800, 0, 'Das ist ein Test');
Ausgewählt werden sollten mit der Query die Datensätze mit ID 5 und 6, da sie den Kriterien entsprechen.

Danke dir! :)
 
Hallo,

ich erlaub mich mal einzumischen. Ich hätte hier eine Lösung, die allerdings umständlicher geworden ist als ich anfangs dachte... aber vielleicht kann man daran ja noch etwas optimieren:
SQL:
SELECT * FROM daten
WHERE
   (DATE_FORMAT(NOW(), "%m%d") BETWEEN
      DATE_FORMAT(FROM_UNIXTIME(date_start), "%m%d") AND
      DATE_FORMAT(FROM_UNIXTIME(date_end), "%m%d"))
OR (DATE_FORMAT(FROM_UNIXTIME(date_end), "%m%d") BETWEEN
      DATE_FORMAT(NOW(), "%m%d") AND
      DATE_FORMAT(FROM_UNIXTIME(date_start) - INTERVAL 1 DAY, "%m%d"))
OR (DATE_FORMAT(FROM_UNIXTIME(date_start), "%m%d") BETWEEN
      DATE_FORMAT(FROM_UNIXTIME(date_end) + INTERVAL 1 DAY, "%m%d") AND
      DATE_FORMAT(NOW(), "%m%d"))
An den drei Fällen kommt man vermutlich nicht vorbei.

Grüße, Matthias
 
Ich danke Euch beiden vielmals! :)

Works like a charm. Ich bin die Lösung mal durchgegangen, und habe durch die DATE_FORMAT-Funktion wieder einiges in Sachen MySQL gelernt.

Super Hilfe, vielen Dank nochmals!
 
Zurück