我在MySQL中的查询未获得预期的结果

问题描述 投票:1回答:1

我具有以下表结构,具有逐日班次。仅在[[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');

数据表示如下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

在上面获取的结果集中,最后一行不是预期的,也不应显示,即使我通过了2010-01-,我也想在第一行中检索2010-01-01的C偏移02 00:00:00,因为它应该属于2010年1月1日的C转换。这是我期望的以下结果enter image description here

我该如何实现?

mysql sql select
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的作用。

请注意,此处不需要条件周围的嵌套括号。

© www.soinside.com 2019 - 2024. All rights reserved.