我具有以下表结构,具有逐日班次。仅在[[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'); insert into `machine_shifts` (`date`, `shift_start_time`, `shift_end_time`, `shift`, `updated_on`) values('2010-01-01','14:30:00','22:30: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-01','22:30: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','14:30: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','14:30:00','22:30: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','22:30: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','14:30: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','14:30:00','22:30: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','22:30: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-04','06:00:00','14:30: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-04','14:30:00','22:30: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-04','22:30:00','06:00:00','C','2020-01-29 15:37:27');
数据表示如下现在我想要的是,我想检索两个给定时间轴之间的数据,其中包括从上述数据集中的偏移。我有以下查询
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
通过以上查询,我得到的是在上面获取的结果集中,最后一行不是预期的,也不应显示,即使我通过了2010-01-,我也想在第一行中检索2010-01-01的C偏移02 00:00:00,因为它应该属于2010年1月1日的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
的作用。请注意,此处不需要条件周围的嵌套括号。