如何获取MySQL两列之间的记录?
How to fetch records in between the ranges of two columns in MySQL?
下面是 table 我已经 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');
假设我有一台机器在 2010:01:01 时间 07:01:00 启动并结束在 2010:01:03 时间 10:00:00。
我想查询上面的table得到开始时间和结束时间之间的记录。
预期输出:
标记线之间是预期的输出。
试试这个:
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)
或者如果您希望在满足任何条件后得到结果,请使用:
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');
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';
您可以实施一个建议 - 在 shift_start_time
和 shift_end_time
上使用 DATETIME
字段而不是 TIME
并删除 date
列。这将使您的查询更容易、更快速。
select * 来自 machine_shifts,其中日期在 2010-01-01 和 2010-01-03 之间并且 shift_start_time >= start_time 和 shift_end_time <= end_time
下面是 table 我已经 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');
假设我有一台机器在 2010:01:01 时间 07:01:00 启动并结束在 2010:01:03 时间 10:00:00。
我想查询上面的table得到开始时间和结束时间之间的记录。
预期输出:
标记线之间是预期的输出。
试试这个:
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)
或者如果您希望在满足任何条件后得到结果,请使用:
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');
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';
您可以实施一个建议 - 在 shift_start_time
和 shift_end_time
上使用 DATETIME
字段而不是 TIME
并删除 date
列。这将使您的查询更容易、更快速。
select * 来自 machine_shifts,其中日期在 2010-01-01 和 2010-01-03 之间并且 shift_start_time >= start_time 和 shift_end_time <= end_time