| 

.NET C# Java Javascript Exception

2
Hallo

Es geht um einen Mittagstisch, der von Montag - Freitag jeden Tag ein Gericht hat.

Angenommen heute ist Mittwoch, dann sollen die 5 Daten der aktuellen Woche von Montag bis Freitag ausgegeben werden.
Ist Samstag, dann sollen die Daten der folgenden Woche von Mo-Fr erscheinen.

Ist dies möglich mit einer direkten Abfrage?
Mir fällt per between nur ein, das ich 5 tage zurück gehe und 7 tage vor und per PHP dann den Rest herausfilter... geht vielleicht eleganter?

Danke.
News:
24.05.2014
meone 99 1 6
2 Antworten
1
Interessante Frage. Basierend auf dieser Stackoverflow-Antwort müsste das eigentlich mit folgendem Code funktionieren:

select * from wochenkarte where 
(DAYOFWEEK(now()) BETWEEN 2 AND 6 AND yearweek(tag, 1) = yearweek(now(), 1))
OR
((DAYOFWEEK(now()) = 1 OR DAYOFWEEK(now()) = 7) AND yearweek(tag, 1) = yearweek(now(), 1) + 1);

Dabei wird über die Kalenderwoche geprüft welche Tage ausgewählt werden müssen. Mit dem DAYOFWEEK wird geprüft ob now() auf einen Sa (=7) oder So (=1) fällt. Im ersten Fall (Mo-Fr) geht das mit BETWEEN, im zweiten Fall (Sa-So) leider nicht.

Ob das jetzt eleganter ist als in PHP den gewünschten Zeitraum zu berechnen und eine einfache BETWEEN-Query zu verwenden liegt im Auge der Betrachters ;)

Nachtrag: Variante mit NOT BETWEEN wie es muffi vorgeschlagen hat.

select * from wochenkarte where 
(DAYOFWEEK(now()) BETWEEN 2 AND 6 AND yearweek(tag, 1) = yearweek(now(), 1))
OR
(DAYOFWEEK(now()) NOT BETWEEN 2 AND 6 AND yearweek(tag, 1) = yearweek(now(), 1) + 1);


Nachtrag 2: Die Tabellenstruktur für meinen kurzen Test

mysql> describe wochenkarte;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| tag | date | YES | | NULL | |
| gericht | varchar(255) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
25.05.2014
phg 1,6k 3
1
Sa und So müsste mit NOT BETWEEN funktionieren.
muffi 26.05.2014
0
Hm, klingt an sich gut...

select * from `mm_mittagstisch` where 
(DAYOFWEEK(now()) BETWEEN 2 AND 6 AND yearweek(`Datum`, 1) = yearweek(now(), 1))
OR
((DAYOFWEEK(now()) = 1 OR DAYOFWEEK(now()) = 7) AND yearweek(`Datum`, 1) = yearweek(now(), 1) + 1);


Hab 3 Einträge drin (2 sollten angezeigt werden)... zB Datum = 1401062400
Aber bekomme 0 Ergebnisse... oder ist es mit "tag" anders gemeint?
26.05.2014
meone 99 1 6
Ich hab mal die Tabellenstruktur nachgereicht. Mit tag ist das Datum gemeint, Spalten-Typ ist Date. Allerdings habe ich immer für Mo-Fr Einträge in der Tabelle... Wenn du deine Tabellenstruktur und die Inhalte postest könnte ich mir das mal genauer anschauen.
phg 26.05.2014
CREATE TABLE IF NOT EXISTS `mm_mittagstisch` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(10) unsigned NOT NULL,
`sorting` int(10) unsigned NOT NULL DEFAULT '0',
`tstamp` int(10) unsigned NOT NULL DEFAULT '0',
`titel_walle` varchar(255) NOT NULL DEFAULT '',
`titel_lesum` varchar(255) NOT NULL DEFAULT '',
`preis_walle` double DEFAULT NULL,
`preis_lesum` varchar(255) NOT NULL DEFAULT '',
`Datum` int(10) DEFAULT NULL,
`bild_walle` blob,
`bild_lesum` blob,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
meone 26.05.2014
Hm, also ich nutze als CMS Contao und den Katalog, der gibt mir INT vor (und mit Date klappt der Datepicker dort nicht)... allerdings habe ich kurz auf Date umgestellt und die Einträge angepasst und trotzdem 0 Ergebnisse :-/

Oben die Struktur.
meone 26.05.2014
INSERT INTO `mm_mittagstisch` (`id`, `pid`, `sorting`, `tstamp`, `titel_walle`, `titel_lesum`, `preis_walle`, `preis_lesum`, `beschreibung_walle`, `beschreibung_lesum`, `Datum`, `bild_walle`, `bild_lesum`) VALUES
(1, 0, 0, 1401138044, 'Nudelauflauf', '', 5.5, '', 'Mit lecker Tomaten Salat.', '', 1401235200, 0xde858403dad811e393aa50465d6f313b, ''),
(2, 0, 256, 1401138029, 'Currytopf', '', 13.88, '', 'mit Deckel', '', 1401753600, '', ''),
(3, 0, 512, 1401138011, 'Test', '', 22, '', 'Mein Test', '', 1400803200, 0xf9e009f8dad811e393aa50465d6f313b, '');

In der Struktur fehlen die Beschreibungen..
meone 26.05.2014
Deine Datums-Spalte ist vom Typ INT und nicht vom Typ DATE/DATETIME/TIMESTAMP. In meiner Antwort bin ich davon ausgegangen, dass die Spalte vom Typ DATE/DATETIME/TIMESTAMP ist. Du müsstest die Werte in der Query erst konvertieren...
Warum verwendest du nicht einfach einen passenden Datentyp für die Spalte 'Datum'?
phg 27.05.2014
hatte ich ja geschrieben, ich nutze einen CMS Katalog, der Typ Datum erhält dort in der Datenbank INT... dies kann ich nicht ändern, dann funktioniert der Datumspicker nicht mehr. Warum dies so gelöst wurde weiss ich nicht, ist aber ein sehr bekanntes CMS und das wohl bekannteste Plugin dafür.

Ich werde mir deine Lösung mal merken, kann man sicher mal wieder gebrauchen und es dann diesmal etwas anders sonst lösen. Danke.
meone 27.05.2014
Sorry, das hab ich übersehen, war schon spät ;) Versuch doch mal

select * from `mm_mittagstisch` where
(DAYOFWEEK(now()) BETWEEN 2 AND 6 AND yearweek(FROM_UNIXTIME(`Datum`), 1) = yearweek(now(), 1))
OR
((DAYOFWEEK(now()) = 1 OR DAYOFWEEK(now()) = 7) AND yearweek(FROM_UNIXTIME(`Datum`), 1) = yearweek(now(), 1) + 1);
phg 27.05.2014

Stelle deine Php-Frage jetzt!