Получить строку между группами дней

Дни, определенные как:

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

У меня есть несколько групп в базе данных, которые имеют start_day , end_day ,…

Часть SQL является это

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

Теперь, если моя группа имеет

start_day: 0
end_day: 4

или

start_day: 5
end_day: 6

вышеуказанный SQL работает полностью нормально. Проблема становится в этом случае

start_day: 4
end_day: 5

и

start_day: 6
end_day: 3 

когда я пытаюсь получить вторую группу, например, для дня 6, так как start_day больше, чем end_day. Как лучше всего сделать так, чтобы это сработало?

В основном у меня есть цены, которые зависят от дня недели, и мне нужно получить правильную цену за данный день недели.

2 ответа

  1. Если я понимаю проблему, кажется, что дневные диапазоны, которые охватывают между воскресеньем и понедельником, вызывают проблему?

    Дополнительное предложение ниже должно учитывать этот случай:

    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 )
        ) 
    )
    
  2. Добавить таблицу с двумя неделями:

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

    И запрос с:

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

    В Postgres это можно записать как subselect. Другой вариант-хранимая процедура,но есть и некоторые ограничения…