Как получить записи между диапазонами двух столбцов в MySQL? - PullRequest
0 голосов
/ 06 февраля 2020

Ниже приведена следующая таблица: machine_shifts

CREATE TABLE `machine_shifts` (
  `date` date NOT NULL,
  `shift_start_time` time DEFAULT NULL,
  `shift_end_time` time DEFAULT NULL,
  `shift` varchar(20) NOT NULL,
  `updated_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`date`,`shift`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Данные

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

Kishore Kumar Korada

И скажем, у меня есть машина, которая запускалась 2010: 01: 01 во время 07: 01: 00 и заканчивалась 2010: 01: 03 во время 10: 00: 00 .

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

Ожидаемый результат:

enter image description here

Между линией маркировки находится ожидаемый результат.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Попробуйте:

SELECT *
FROM machine_shifts
WHERE (STR_TO_DATE(concat(date, ' ', shift_start_time),'%Y-%c-%e %H:%i:%s' )
       BETWEEN STR_TO_DATE('2010-01-01 07:01:00', '%Y-%c-%e %H:%i:%s') 
       AND STR_TO_DATE('2010-01-03 10:00:00', '%Y-%c-%e %H:%i:%s'))
AND   (STR_TO_DATE(concat(date, ' ', shift_end_time),'%Y-%c-%e %H:%i:%s' )
       BETWEEN STR_TO_DATE('2010-01-01 07:01:00', '%Y-%c-%e %H:%i:%s') 
       AND STR_TO_DATE('2010-01-03 10:00:00', '%Y-%c-%e %H:%i:%s'));

Дополнительная информация:

  • %Y = год (4 цифры)
  • %c = месяц (0- 12)
  • %e = день месяца (0-31)
  • %H = час (с 00 до 23)
  • %i = минуты (00 до 59)
  • %s = секунды (от 00 до 59)

Или, если вы получите sh, что приведет к выполнению любого из условий, а затем используйте:

SELECT *
FROM machine_shifts
WHERE (STR_TO_DATE(concat(date, ' ', shift_start_time),'%Y-%c-%e %H:%i:%s' )
       BETWEEN STR_TO_DATE('2010-01-01 07:01:00', '%Y-%c-%e %H:%i:%s') 
       AND STR_TO_DATE('2010-01-03 10:00:00', '%Y-%c-%e %H:%i:%s'))
OR   (STR_TO_DATE(concat(date, ' ', shift_end_time),'%Y-%c-%e %H:%i:%s' )
       BETWEEN STR_TO_DATE('2010-01-01 07:01:00', '%Y-%c-%e %H:%i:%s') 
       AND STR_TO_DATE('2010-01-03 10:00:00', '%Y-%c-%e %H:%i:%s'));

ИЛИ версия без дополнительного STR_TO_DATE:

SELECT *
FROM machine_shifts
WHERE (STR_TO_DATE(concat(date, ' ', shift_start_time),'%Y-%c-%e %H:%i:%s' )
       BETWEEN '2010-01-01 07:01:00' AND '2010-01-03 10:00:00')
OR   (STR_TO_DATE(concat(date, ' ', shift_end_time),'%Y-%c-%e %H:%i:%s' )
       BETWEEN '2010-01-01 07:01:00' AND '2010-01-03 10:00:00');
0 голосов
/ 06 февраля 2020

выберите * из machine_shifts, где дата между 2010-01-01 и 2010-01-03 и shift_start_time> = start_time и shift_end_time <= end_time </p>

0 голосов
/ 06 февраля 2020
SELECT *
FROM machine_shifts
WHERE STR_TO_DATE(concat(date, ' ', shift_start_time),'%Y-%e-%c %H:%i:%s' ) >= '2010-01-01 07:01:00' 
AND STR_TO_DATE(concat(date, ' ', shift_end_time),'%Y-%e-%c %H:%i:%s' ) <= '2010-01-03 10:00:00';

И одно предложение, которое вы можете реализовать - используйте поле DATETIME вместо TIME в обоих shift_start_time и shift_end_time и удалите столбец date. Это сделает ваш запрос более простым и быстрым.

...