2016-05-01 8 views
0

Tage Zeile wie folgt definiert:Lassen Sie sich zwischen Tag Gruppen

0 - Monday 
1 - Tuesday 
2 - Wednesday 
3 - Thursday 
4 - Friday 
5 - Saturday 
6 - Sunday 

ich mehrere Gruppen in der Datenbank haben, die start_day haben, END_DAY, ...

Teil des SQL ist dies

SELECT * 
    FROM groups AS pg 
    WHERE ... 
    AND pg.start_day <= 6 
    AND pg.end_day >= 6 

Nun, wenn meine Gruppe hat

start_day: 0 
end_day: 4 

oder

start_day: 5 
end_day: 6 

die obige SQL arbeitet völlig in Ordnung. Das Problem wird in diesem Fall

start_day: 4 
end_day: 5 

und

start_day: 6 
end_day: 3 

, wenn ich versuche zweite Gruppe zu erhalten, zum Beispiel für Tag 6 seit start_day größer als END_DAY ist. Was wäre der beste Weg, dies zum Funktionieren zu bringen?

Grundsätzlich habe ich Preise, die von Wochentag abhängen, und ich muss den richtigen Preis für den angegebenen Tag der Woche erhalten.

+1

Ich weiß nicht, ob Sie Ihr Modell an dieser Stelle ändern können, aber die akzeptierte Antwort scheint eine gute Wahl für wöchentliche Ereignisse wie Ihre http: //stackoverflow.com/questions/2836356/best-way-to-store-weekly-event-in-mysql – RubioRic

+0

@RubioRic das klingt nach einer guten Lösung, aber es würde die Website an dieser Stelle komplett durchbrechen. –

+0

nicht zwischen wegen nicht funktionieren würde wegen> = und <= - macht sie nicht < > - so müssen Sie 'NOT (pg.start_day <0 UND pg.end_day> 4)' nach der Negation, die sich als dazwischen ergeben. –

Antwort

0

Wenn ich das Problem verstehe, scheint es, dass Tageszeiten zwischen Sonntag und Montag das Problem verursachen?

Die zusätzliche Klausel für diesen Fall unten sollte berücksichtigen:

Tabelle
WHERE (
    (start_day <= end_day 
     and (start_day <= day_of_week and end_day >= day_of_week) 
    ) 
    OR 
    (start_day > end_day 
     and (day_of_week >= start_day or day_of_week <= end_day) 
    ) 
) 
+0

Aus irgendeinem Grund funktioniert NICHT BETWEEN nicht. Außerdem musste ich das Ganze in zusätzliche Klammern setzen, oder andere Bedingungen wurden wegen OR ignoriert. –

+0

Entschuldigung, ich hatte keine Gelegenheit, NICHT BETWEEN zu testen. Ich werde bearbeiten, um die Bedingung vollständig zu schreiben – Alex

0

In zwei Wochen:

create table test (id int, name varchar(20), ord int); 
insert into test values (0, 'Monday', 0); 
insert into test values (1, 'Tuesday', 1); 
insert into test values (2, 'Wednesday', 2); 
insert into test values (3, 'Thursday', 3); 
insert into test values (4, 'Friday', 4); 
insert into test values (5, 'Saturday', 5); 
insert into test values (6, 'Sunday', 6); 
insert into test values (0, 'Monday', 10); 
insert into test values (1, 'Tuesday', 11); 
insert into test values (2, 'Wednesday', 12); 
insert into test values (3, 'Thursday', 13); 
insert into test values (4, 'Friday', 14); 
insert into test values (5, 'Saturday', 15); 
insert into test values (6, 'Sunday', 16); 

Und Abfrage mit:

select * from test where ord between 4 and 0 or ord between 4 and 10; 

In Postgres könnten Sie schreiben das als subselect. Andere Option ist gespeicherte Prozedur, aber es gibt einige Einschränkungen mit ihnen ...

Verwandte Themen