У меня есть следующая структура таблицы с дневными сменами.
Только в смену 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');
Данные представлены следующим образом
Теперь с помощью следующего запроса Я получаю данные между двумя диапазонами дат. то есть между '2010-01-02 00: 00: 00' и '2010-01-03 10: 00: 00' .
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
С помощью вышеприведенного запроса я получаю
И это набор результатов, которого я очень ожидал. Я мог этого добиться отправив еще один вопрос ранее.
Приведенный выше запрос работает, но он работает только тогда, когда две даты различны, но когда я хочу получить данные между двумя разными периодами времени в пределах одной и той же даты, я Я не получаю ожидаемых данных. Пожалуйста, найдите следующий пример диапазонов дат и времени.
-> '2010-01-01 07:01:00' И '2010-01-01 14: 00: 00' С этим я должен следующие ожидаемые данные, но я получаю пустой набор результатов.
Я хочу, чтобы функциональность вышеуказанного рабочего запроса не изменилась, но я также должен получить данные в течение одного дня.
Редактировать: Просто обнаружил, что даже в приведенном выше запросе есть проблема с этим диапазоном '2010-01-02 00:00:00' И '2010-01-03 14: 30: 00'
SELECT * FROM machine_shifts
WHERE
CONCAT(`date`, ' ', shift_start_time)
BETWEEN '2010-01-02 00:00:00' AND '2010-01-03 14:30:00'
OR
CONCAT(`date`, ' ', shift_end_time) + INTERVAL (shift = 'C') DAY
BETWEEN '2010-01-02 00:00:00' AND '2010-01-03 14:30:00'
ORDER BY `date`, shift_start_time ASC
Здесь я получаю
Здесь я совсем не ожидаю последнего ряда.
Как могу ли я достичь этого? Можете ли вы предложить мне лучший подход ## Заголовок ##