Не получен ожидаемый результат с запросом в MySQL - PullRequest
1 голос
/ 08 февраля 2020

У меня есть следующая структура таблицы с дневными сменами.

Только в смену C время делится на два дня.

Как вы можете C Смена начинается в 20: 30 и заканчивается в следующие дни 06: 00 .

Структура таблицы и данные следующим образом

create table `machine_shifts` (
   `date` date ,
   `shift_start_time` time ,
   `shift_end_time` time ,
   `shift` varchar (60),
   `updated_on` timestamp 
);

insert into `machine_shifts` (`date`, `shift_start_time`, `shift_end_time`, `shift`, `updated_on`) values('2010-01-01','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-01','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-01','22:30:00','06:00:00','C','2020-01-29 15:37:26'),
('2010-01-02','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-02','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-02','22:30:00','06:00:00','C','2020-01-29 15:37:26'),
('2010-01-03','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-03','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-03','22:30:00','06:00:00','C','2020-01-29 15:37:26'),
('2010-01-04','06:00:00','14:30:00','A','2020-01-29 15:37:26'),
('2010-01-04','14:30:00','22:30:00','B','2020-01-29 15:37:26'),
('2010-01-04','22:30:00','06:00:00','C','2020-01-29 15:37:27');

Данные представлены следующим образом:

enter image description here

Теперь, что я хотел, Я хочу получить данные между двумя заданными временными рамками, которые включают смещение из вышеуказанного набора данных. И у меня есть следующий запрос

SELECT * FROM machine_shifts
WHERE ((CONCAT(`date`, ' ', shift_start_time))
   BETWEEN '2010-01-02 00:00:00' AND '2010-01-03 10:00:00')
OR   (CONCAT(`date`, ' ', shift_end_time)
   BETWEEN '2010-01-02 00:00:00' AND '2010-01-03 10:00:00') 
ORDER BY `date`, shift_start_time ASC

С помощью вышеприведенного запроса я получаю enter image description here

В приведенном выше наборе результатов, последняя строка не ожидалась и не должна отображаться. Я также хочу получить C смещение 2010-01-01 в первой строке, хотя я передаю 2010-01-02 00:00:00 должно упасть под C смещение 2010-01-01.
Это следующий результат, который я ожидаю enter image description here

Как мне его достичь?

1 Ответ

2 голосов
/ 08 февраля 2020

Ваш запрос выглядит нормально; вам просто нужно немного условной логики c, чтобы настроить дату окончания для конца смены C.

Это должно сделать это:

SELECT * FROM machine_shifts
WHERE 
    CONCAT(`date`, ' ', shift_start_time)
        BETWEEN '2010-01-02 00:00:00' 
        AND '2010-01-03 10:00:00')
    OR CONCAT(`date`, ' ', shift_end_time) + INTERVAL (shift = 'C') DAY
        BETWEEN '2010-01-02 00:00:00' 
        AND '2010-01-03 10:00:00'
ORDER BY `date`, shift_start_time ASC

Идея состоит в том, чтобы добавьте один день к вычислению, когда мы встретим конец смены C. Это то, что делает выражение + INTERVAL (shift = 'C') DAY.

Обратите внимание, что вложенные скобки вокруг условий здесь не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...